從網站下載文件(遊戲模組)
我的目標: 每天執行一個腳本或命令,以獲得在 Transport Fever 2 模組部分發布的最新模組。 https://www.transportfever.net/filebase/index.php?filebase/80-transport-fever-2/
這是一個模組的例子,你可以下載的文件在底部。 https://www.transportfever.net/filebase/index.php?entry/5107-%C3%B6bb-%C3%A4ra-valousek-%C3%B6bb-1012-%C3%B6bb-1014-%C3%B6bb -1163/
我已經玩過 wget 但我只能下載 index.php 文件(我是 Linux 的初學者)。
我認為問題在於,他們將文件託管在第三方託管商上。
有誰知道我如何實現我的目標?:)
提前致謝!
https://www.transportfever.net/filebase/index.php?filebase/80-transport-fever-2/提供最新文件的連結。可以使用 下載站點的 html 文件,通過
curl
管道輸出以提取下載連結(使用下面的簡單方式完成grep
)並使用命令替換,將此連結傳遞給第二個curl
命令。curl -OJ \ $(curl -fs \ 'https://www.transportfever.net/filebase/index.php?filebase/80-transport-fever-2/' | \ grep -om1 '[^"]*entry-download/[^"]*')
希望這可以為您提供一些基礎。
grep
使用的選項:
-o
/--only-matching
只輸出匹配的模式,而不是包含模式的整行-m 1
/--max-count=1
在包含匹配的第一行之後停止搜尋輸入- 要匹配的模式:
[^"]*entry-download/[^"]*
: 下載連結似乎都給出了href="https://www.transportfever.net/filebase/index.php?entry-download/<number><...>"
– 所以上面的模式匹配似乎就足夠了:除了雙引號之外的任何字元的零個或多個"
,然後是entry-download/
,再後面是零個或多個除雙引號之外的任何字元"
curl
使用的選項(第一次通過 - 在替換內):第二遍
curl
選項——這些下載連結使用content-disposition
標題來告訴我們文件名,所以:
-O
/--remote-name
使用與遠端文件相同的名稱保存文件-J
/--remote-header-name
允許-O
選擇使用伺服器指定的 Content-Disposition 文件名,而不是從 URL 中提取文件名實際上有不止一個
entry-download/
連結——要下載所有連結,我們可以從第二個選項中刪除-m1
並調整要使用grep
的選項,如下所示:curl``--remote-name-all
curl --remote-name-all -J \ $(curl -fs \ 'https://www.transportfever.net/filebase/index.php?filebase/80-transport-fever-2/' | \ grep -o '[^"]*entry-download/[^"]*')
文件衝突檢查:
如果我們想提前知道
content-disposition
頭部描述的文件名,就需要一個額外的步驟。我們可以使用 curl 發送head
請求:# get first url from the page, storing it to # the parameter 'url' so we can use it again later url=$(curl -fs \ 'https://www.transportfever.net/filebase/index.php?filebase/80-transport-fever-2/' | \ grep -om1 '[^" ]*entry-download/[^" ]*') # head request to determine filename filename=$(curl -Is "$url" | grep -iom1 '^content-disposition:.*filename="[^"]*' | grep -o '[^"]*$') # 'if' statement using the 'test' / '[' command as the condition if test -e "$filename"; then echo "$filename exists!" else # a file named $filename doesn't exit, # so we'll download it curl -o "$filename" "$url" fi
- 這是一個簡單的例子,它在嘗試下載之前檢查衝突的文件
- 不是真的有必要,因為
curl -J
不會覆蓋現有文件,但我懷疑你想檢查是否存在"$filename"
- 可能沒有.zip
:"${filename%.zip}"
- 在某個其他目錄,或者可能在某個文本文件中在上述基礎上,如果您想對所有提取的
entry-download/
url 執行此操作:# extract all urls, placing them in an array parameter 'urls' urls=( $(curl -fs \ 'https://www.transportfever.net/filebase/index.php?filebase/80-transport-fever-2/' | \ grep -o '[^" ]*entry-download/[^" ]*') ) # loop over extracted urls for i in "${urls[@]}"; do # do filename extraction for "$i" # use filename to determine if you want to download "$i" done