
ファイルのベース名が同じ場合、wget で特定のファイルタイプを他のファイルタイプよりも優先するようにします。
例えば:
もしoggファイル利用可能、ダウンロードしないでください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
単一ファイル
「ファイルバツ存在する場合はダウンロードし、そうでない場合はファイルをダウンロードするええ「」では、次の操作を実行できます。
wget x || wget y
もしバツ存在する場合、ダウンロードされてwget
が返されるtrue
ため、2番目の部分はスキップされます。バツ存在しない場合は、wget
何らかのエラーコード(おそらく8)を返し、式の2番目の部分が評価されます(ダウンロードされますええ)。
再帰的に
ただし、これは明らかに再帰ダウンロードにはあまり役立ちません。wget
このレベルの高度なマスク機能を備えているとは思えません。man ページでも、複雑な条件については説明されていないようです。ただし、少し変更したアプローチは機能する可能性があります。
(ダウンロードしたいもののリストを作成するように説得するのは難しいようですwget
。私の最初のアイデアは、@utkuerd が提案しているように、これを作成し、ダウンロードする前に適切にフィルタリングすることでした。)
出発点は当然のことながら、まずすべてのoggファイルをダウンロードすることでしょう。おそらく
wget -Dfoo.com -I /folder/ -r -l 1 -nc -A.ogg -i http://www.foo.com/folder/
適切なマスクをリストとして提供すれば、残りの mp3 ファイルも同じ方法でダウンロードできます--reject
。このリストには、ダウンロードしたくないすべての 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
残りのmp3ファイルを取得する( を利用して-nc
)
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 ファイルはその後破棄されます。