単一のファイルをダウンロードする場合、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.jpg
、image2.jpg
を2.jpg
として保存することはできますか?
簡単なスクリプトまたはテキスト操作技術を使用して複数のwgetコマンドを作成し、それぞれが単一のUrlをダウンロードして出力ファイルに書き込むことができることを知っています。私はテストしていませんが、これは私には遅いようで、単一のwgetプロセスを使用してすべてのファイルをダウンロードする方法があるかどうかを知りたいです。
Wgetの1回の呼び出しだけでそれを行うことはできません。これは、Wgetの-O
オプションの定義に由来します。これは、単に保存されたファイルの名前を意味するのではなく、stdoutのシェルリダイレクトです。
サーバー上ですべてのファイル名が異なる場合でも、Wgetの1回の呼び出しですべてのファイルをダウンロードし、シェルスクリプトを使用して名前を変更することで、これをかなり迅速に行うことができます。
Wgetの複数の呼び出しが遅くなるというのはあなたの言うとおりです。プロセスの起動と破棄は1つの側面ですが、ファイルごとにサーバーへの新しいHTTP接続を確立する必要があるため、非常に短時間で追加されます。
ファイルを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 (それよりも多くのパラメーターを渡すだけ)。これは、小さなファイルの場合、すべてを高速化するはずです。
とにかくターゲットファイル名のリストを作成する必要がある場合は、ダウンロード後にファイル名を変更することもできます(これも実際に要求した方法ではありません)。