Wget - if/else 下載條件?

Wget - if/else 下載條件?

如果文件具有相同的基本名稱,我希望 wget 更喜歡某種文件類型而不是另一種文件類型。

例如:

如果foo.ogg可用,請勿下載foo.mp3


到目前為止我使用 wget 爬行/自動下載的方式(如果有人有興趣):

wget -Dfoo.com -I /folder/ -r -l 1 -nc -A.ogg,.mp3 http://www.foo.com/folder/

但這當然讓我得到 .mp3 和 .ogg文件。有任何想法嗎?

  • (語法解釋:-D
    :僅從此網域下載
    -I:僅從此網域的子資料夾下載
    -r:遞歸(追蹤連結與目錄結構)
    -l 1:僅追蹤 1 個深層連結
    -nc:無破壞 = 下載僅當文件不存在時
    -A:僅接受/下載所有 *.ogg 和 *.mp3(丟棄必要的 html 文件)
    (-i(可選在 URL 前面):從 URL 讀取 URL,但也下載其他文件像.png 這樣的檔案類型,您一開始就不需要/之後丟棄它們)

答案1

單一文件

要完成“如果文件X存在,下載;否則下載文件y”,您可以執行以下操作:

wget x || wget y

如果X存在,則下載並wget返回true,因此跳過第二部分。如果X不存在,wget傳回一些錯誤代碼(可能是 8)並且計算表達式的第二部分(下載y)。

遞迴地

不過,這顯然對您的遞歸下載沒有太大幫助。如果wget有設施來適應這種複雜程度的掩蔽,我會感到驚訝。手冊頁似乎也沒有涵蓋任何形式的花俏條件。不過,稍微修改一下方法也可能有效。

(似乎很難說服人們wget產生要下載的內容的清單。我的第一個想法是創建此清單並在下載之前對其進行適當的過濾,就像 @utkuerd 建議的那樣。)

一個起點自然是先下載所有 ogg 文件,大概是透過

wget -Dfoo.com -I /folder/ -r -l 1 -nc -A.ogg -i http://www.foo.com/folder/

--reject如果您有合適的遮罩作為清單提供,則可以透過相同的方法下載其餘的 mp3 檔案。此列表應包含您不想下載的每個 mp3 檔案的名稱。

假設我建議您按如下方式建立此列表

bl=($(find ./ -name '*.ogg' -exec basename -s .ogg {} \+ | sed 's/\(^.\+$\)/\1.mp3/' ) )

現在您有一個要封鎖的 mp3 檔案的 bash 陣列。

要僅下載未封鎖的 mp3 文件,您可以使用

IFS=','; wget -Dfoo.com -I /folder/ -r -l 1 -nc -A.mp3 -R"${bl[*]}" -i http://www.foo.com/folder/; unset IFS

必須修改該IFS變量,以便列表不會以空格分隔。

顯然,如果 ogg 檔案列表長於getconf ARG_MAX(它將破壞 wget 命令)或檔案名稱包含空格(它將破壞阻止列表,可能會給您帶來額外的檔案和(不太可能)丟失的檔案),這將在不同程度上造成嚴重影響文件)。兩者都是可以修復的。

請注意,拒絕清單中多餘的逗號給出有趣的結果。

@Bob 的優秀建議的撰寫

(請參閱下面的評論)

獲取 ogg 文件後

wget -Dfoo.com -I /folder/ -r -l 1 -nc -A.ogg -i http://www.foo.com/folder/

你可以像這樣建立虛擬 mp3 文件

find ./ -name '*.ogg' | sed 's/ogg$/mp3/' | xargs -d '\n' touch 

-nc並使用 (exploiting )取得剩餘的 mp3 文件

wget -Dfoo.com -I /folder/ -r -l 1 -nc -A.mp3 -i http://www.foo.com/folder/

然後可以使用以下命令刪除多餘的 mp3 文件

find ./ -name '*.mp3' -size 0 -exec rm '{}' \+

我測試過這適用於名稱中的空格。

答案2

我不認為 wget 的 -A 選項有能力以智慧方式在給定的檔案名稱模式中進行選擇。您很可能需要一個腳本來實現您想要的。您應該取得目錄列表,自己解析它,然後下載您想要的檔案。

對於下載並丟棄的 .png 文件,您錯誤地使用了 -i 標誌。 -i 標誌指定包含要下載的 URL 的檔案(或 URL)。您應該指定沒有任何標誌的起點。如果刪除 -i 標誌,則不會下載其他檔案類型,只會下載 .ogg、.mp3 和必要的 html 檔案。之後 html 檔案將被丟棄。

相關內容