というファイルにリストURLがありますurls.txt
。各行には1つのURLが含まれています。cURLを使用してすべてのファイルを一度にダウンロードしたい。正しいワンライナーを下ろすことができないようです。
私は試した:
$ cat urls.txt | xargs -0 curl -O
しかし、それは私にリストの最後のファイルを与えるだけです。
というファイルにリストURLがありますurls.txt
。各行には1つのURLが含まれています。cURLを使用してすべてのファイルを一度にダウンロードしたい。正しいワンライナーを下ろすことができないようです。
私は試した:
$ cat urls.txt | xargs -0 curl -O
しかし、それは私にリストの最後のファイルを与えるだけです。
tr
:for i in $(cat urls.txt) ; do curl -O $(echo $i | tr '\r' ' ') ; done
回答:
これは私のために働きます:
$ xargs -n 1 curl -O < urls.txt
私はFreeBSDにいます。xargsの動作が異なる場合があります。
これはシーケンシャルを実行することに注意してください。これはcurl
不必要に重いと見なされる場合があります。そのオーバーヘッドの一部を節約したい場合は、以下がbashで機能する可能性があります。
$ mapfile -t urls < urls.txt
$ curl ${urls[@]/#/-O }
これにより、URLリストが配列に保存され、配列が展開されcurl
て、ターゲットがダウンロードされるようになります。このcurl
コマンドは、複数のURLを取得してすべてをフェッチし、既存の接続(HTTP / 1.1)をリサイクルできますが、各ターゲット-O
をダウンロードして保存するには、各URLの前にオプションが必要です。一部のURL内の文字]は、シェルとの相互作用を避けるためにエスケープする必要がある場合があることに注意してください。
または、bashではなくPOSIXシェルを使用している場合:
$ curl $(printf ' -O %s' $(cat urls.txt))
これはprintf
、フォーマットパターンを繰り返してデータ引数のリストを使い果たすというの動作に依存しています。すべてのスタンドアロンprintf
がこれを行うわけではありません。
この非xargsメソッドは、URLの非常に大きなリストのシステム制限にぶつかる可能性があることに注意してください。研究ARG_MAXとMAX_ARG_STRLENこれが懸念される場合。
-L
オプションを追加する必要がありましたcurl
。
cat urls.txt | xargs -n 1 curl -O
;-)
\r
したため、テキストファイルの文字が気に入らなかった。
非常に簡単な解決策は次のとおりです。次のようなファイル 'file.txt'がある場合
url="http://www.google.de"
url="http://www.yahoo.de"
url="http://www.bing.de"
次に、curlを使用して簡単に実行できます
curl -K file.txt
そして、curlはfile.txtに含まれるすべてのURLを呼び出します!
したがって、入力ファイル形式を制御できる場合は、これが最も簡単なソリューションかもしれません。
または、これを行うこともできます。
cat urls.txt | xargs curl -O
-I
コマンドの途中にcat出力を挿入する場合にのみ、パラメーターを使用する必要があります。
-o
curlのオプションは、引数として出力ファイルを指定します。他の回答-O
では、ファイルのリモート名に基づいてローカル名を決定するようにcurlに指示することをお勧めします。
xargs -P 10 | curl
GNUxargs -P
は複数のcurl
プロセスを並行して実行できます。例10
:プロセスを実行 する:
xargs -P 10 -n 1 curl -O < urls.txt
これにより、最大ダウンロード速度に達していない場合、およびサーバーがIPを抑制しない場合、ダウンロードが10倍高速化されます。これは、最も一般的なシナリオです。
設定を-P
高くしすぎないでください。設定が高すぎると、RAMが圧倒される可能性があります。
GNUparallel
は同様の結果を達成できます。
これらのメソッドの欠点は、すべてのファイルに単一の接続を使用しないことです。これcurl
は、次のように一度に複数のURLを渡すとどうなりますか。
curl -O out1.txt http://exmple.com/1 -O out2.txt http://exmple.com/2
/server/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フラグを使用すると、元のファイル名が取得されます
ハッピーダウンロード!
echo ";sudo rm -rf ~/" >> testcurl.txt
何が起こるかを確認します。
他の人が正しく言及しているように:
-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
-i-
、stdinを参照するために使用することもできます。すなわち:wget -i- < urls.txt
あなたがしたい場合は最後に、curl
一度に複数のURLを要求するために、復活を必要とせずに、あなたは常にだけで、コマンドライン上に置くことができます。 xargs curl < urls.txt
HTTP /1.1を使用してこれを行います。xargsが処理できるコマンドラインの長さによってURLの数が制限されます。でこの制限を見つけてくださいgetconf ARG_MAX
。
for i in $(cat urls.txt) ; do curl -O $i ; done