web-dev-qa-db-ja.com

ファイルリストからwgetダウンロードファイル、ダウンロードされた各ファイルの名前を指定する方法

単一のファイルをダウンロードする場合、wgetの-Oオプションを使用してファイル名を指定できます。 wget -i filelist.txtを使用してファイル内のURLをダウンロードする場合(filelist.txtにダウンロードするURLのリストが含まれています)、ダウンロード時に各ファイルの名前が変更されるようにfilelist.txtを作成するにはどうすればよいですか?

Exの場合、filelist.txtに次のコンテンツが含まれている場合:

--output-document=1.jpg http://images2.example.com/image1.jpg
--output-document=2.jpg http://images2.example.com/image2.jpg

image1.jpgをダウンロードして1.jpgimage2.jpg2.jpgとして保存することはできますか?


編集する

簡単なスクリプトまたはテキスト操作技術を使用して複数のwgetコマンドを作成し、それぞれが単一のUrlをダウンロードして出力ファイルに書き込むことができることを知っています。私はテストしていませんが、これは私には遅いようで、単一のwgetプロセスを使用してすべてのファイルをダウンロードする方法があるかどうかを知りたいです。

4
Just a learner

Wgetの1回の呼び出しだけでそれを行うことはできません。これは、Wgetの-Oオプションの定義に由来します。これは、単に保存されたファイルの名前を意味するのではなく、stdoutのシェルリダイレクトです。

サーバー上ですべてのファイル名が異なる場合でも、Wgetの1回の呼び出しですべてのファイルをダウンロードし、シェルスクリプトを使用して名前を変更することで、これをかなり迅速に行うことができます。

Wgetの複数の呼び出しが遅くなるというのはあなたの言うとおりです。プロセスの起動と破棄は1つの側面ですが、ファイルごとにサーバーへの新しいHTTP接続を確立する必要があるため、非常に短時間で追加されます。

1
darnir

ファイルを1行ずつループし、行の内容を変数FOOに読み込んで、wgetパラメータとして使用します。

while read FOO; do echo wget $FOO; done < filelist.txt

パラメータを使用してコマンドラインを構築するためのこのわずかな時間は、ダウンロード時間と比較して害を及ぼすことはありません。サーバー側ではまったく違いがありません。同じまたは異なるwgetプロセスがファイルの単一のリクエストを実行する場合、両方のシナリオで行われますが、キープアライブを少しだけオフにしても大きな違いはありません。 、私の意見で。

ちなみに、wgetは常にシングルスレッドであり、マルチスレッドにするためのパラメーターはありません。おそらく、実際に試してみて、実際の速度がどれほど遅いかを確認する必要があります。-iを使用する代わりに、各URLに対して新しいwgetプロセスを開始し、処理が速くなることを期待してください。それがどれほど遅いかを推測する必要がありますが、それを見てください。
また、いくつかのwgetプロセスを開始することもできます。これは https://stackoverflow.com/questions/7577615/parallel-wget-in-bash/11850469 #11850469 (それよりも多くのパラメーターを渡すだけ)。これは、小さなファイルの場合、すべてを高速化するはずです。

とにかくターゲットファイル名のリストを作成する必要がある場合は、ダウンロード後にファイル名を変更することもできます(これも実際に要求した方法ではありません)。

1
Jaleks