web-dev-qa-db-ja.com

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:再帰的(リンクとディレクトリ構造をたどる)
    -l1:リンクを1つだけ深くたどる
    -nc:クローバーなし=ファイルが存在しない場合にのみダウンロード
    -A:すべての* .oggと* .mp3のみを受け入れ/ダウンロードします(必要なhtmlファイルを破棄します)
    (-i(オプションでURLの前):URLからURLを読み取りますが、最初は不要だった.pngなどの他のファイルタイプもダウンロードします/後で破棄します)
3
Kai

単一ファイル

「ファイルxが存在する場合はダウンロードし、そうでない場合はファイルy "をダウンロードするには、次のようにします。

wget x || wget y

xが存在する場合、ダウンロードされ、wgettrueを返すため、2番目の部分はスキップされます。 xが存在しない場合、wgetはエラーコード(おそらく8)を返し、式の2番目の部分が評価されます(ダウンロード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 

残りの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 '{}' \+

これが名前のスペースで機能することをテストしました。

6
Eroen

-wgetのオプションには、与えられたファイル名パターンの中から賢く選択する力があるとは思いません。ほとんどの場合、必要なことを実現するためのスクリプトが必要です。ディレクトリリストを取得し、自分で解析してから、必要なファイルをダウンロードする必要があります。

ダウンロードして破棄する.pngファイルの場合、-iフラグを誤って使用しました。 -iフラグは、ダウンロードするURLを含むファイル(またはURL)を指定します。フラグなしで開始点を指定する必要があります。 -iフラグを削除すると、他のファイルタイプはダウンロードされず、.ogg、.mp3、および必要なhtmlファイルのみがダウンロードされます。 htmlファイルは後で破棄されます。

2