urls.txt
というファイルにリストURLがあります。各行には1つのURLが含まれます。 cURLを使用してすべてのファイルを一度にダウンロードしたい。正しいワンライナーを降ろせないようです。
私は試した:
$ cat urls.txt | xargs -0 curl -O
しかし、それはリストの最後のファイルのみを提供します。
これは私のために働く:
$ xargs -n 1 curl -O < urls.txt
私はFreeBSDにいます。 xargsは異なる動作をする場合があります。
これは、連続したcurl
sを実行することに注意してください。これは不必要に重いとみなされる場合があります。そのオーバーヘッドの一部を節約したい場合は、bashで次のように動作します。
$ mapfile -t urls < urls.txt
$ curl "${urls[@]/#/-O }"
これにより、URLリストが配列に保存され、curl
のオプションで配列が展開され、ターゲットがダウンロードされます。 curl
コマンドは複数のURLを取得し、それらすべてを取得し、既存の接続(HTTP/1.1)をリサイクルできますが、-O
オプションを使用して、各ターゲットをダウンロードおよび保存します。
または、bashではなくPOSIXシェルを使用している場合:
$ curl $(printf ' -O %s' $(cat urls.txt))
これは、データパターンのリストを使い果たすためにフォーマットパターンを繰り返すprintf
の動作に依存しています。すべてのスタンドアロンprintf
sがこれを行うわけではありません。
この非xargsメソッドは、URLの非常に大きなリストのシステム制限に突き当たる可能性があることに注意してください。調査 ARG_MAX および MAX_ARG_STRLEN これが懸念される場合。
非常に簡単な解決策は次のようになります: 'file.txt'のようなファイルがある場合
url="http://www.google.de"
url="http://www.yahoo.de"
url="http://www.bing.de"
次に、カールを使用して、単に行うことができます
curl -K file.txt
そしてcurlはfile.txtに含まれるすべてのURLを呼び出します!
したがって、入力ファイル形式を制御できる場合、これが最も簡単なソリューションかもしれません!
または、これを行うことができます:
cat urls.txt | xargs curl -O
使用する必要があるのは、-I
パラメータは、コマンドの途中にcat出力を挿入する場合に使用します。
xargs -P 10 | curl
GNU xargs -P
は、複数のcurl
プロセスを並行して実行できます。例えば。 10
プロセスを実行するには:
xargs -P 10 -n 1 curl -O < urls.txt
これは、最大ダウンロード速度に達していない場合、およびサーバーがIPを調整しない場合にダウンロードを10倍高速化します。これは最も一般的なシナリオです。
-P
の設定が高すぎると、RAMが圧倒される可能性があります。
GNU parallel
は同様の結果を達成できます。
これらのメソッドの欠点は、すべてのファイルに対して単一の接続を使用しないことです。複数のURLを一度に渡すと、curl
は何をしますか:
curl -O out1.txt http://exmple.com/1 -O out2.txt http://exmple.com/2
https://serverfault.com/questions/199434/how-do-i-make-curl-use-keepalive-from-the-command-line
おそらく両方の方法を組み合わせることで最良の結果が得られるでしょうか?しかし、接続を維持するよりも並列化の方が重要だと思います。
Mac(OSX)でどのように実行するかを以下に示しますが、他のシステムでも同様に動作するはずです。
必要なのは、curlのリンクを含むテキストファイルです
そのようです:
http://www.site1.com/subdirectory/file1-[01-15].jpg
http://www.site1.com/subdirectory/file2-[01-15].jpg
.
.
http://www.site1.com/subdirectory/file3287-[01-15].jpg
この架空のケースでは、テキストファイルには3287行あり、各行は15枚の画像をコーディングしています。
これらのリンクを、ハードドライブの最上位(/)にあるtestcurl.txtというテキストファイルに保存するとします。
次に、ターミナルに移動して、bashシェルで次のコマンドを入力する必要があります。
for i in "`cat /testcurl.txt`" ; do curl -O "$i" ; done
バックティック( `)を使用していることを確認してください。また、フラグ(-O)がゼロではなく大文字のOであることを確認してください
-Oフラグを使用すると、元のファイル名が取得されます
ハッピーダウンロード!
他の人が正しく述べているように:
-cat urls.txt | xargs -0 curl -O
+cat urls.txt | xargs -n1 curl -O
ただし、このパラダイムは非常に悪い考えです。特に、すべてのURLが同じサーバーからのものである場合は、別のcurlインスタンスを生成するだけでなく、新しいTCP各リクエストの接続。これは非常に非効率的であり、現在広く普及しているhttpsではさらに効率的です。
代わりにこれを使用してください:
-cat urls.txt | xargs -n1 curl -O
+cat urls.txt | wget -i/dev/fd/0
または、さらに簡単:
-cat urls.txt | wget -i/dev/fd/0
+wget -i/dev/fd/0 < urls.txt
まだ最も簡単な:
-wget -i/dev/fd/0 < urls.txt
+wget -iurls.txt