web-dev-qa-db-ja.com

catの出力をcURLにパイプして、ファイルのリストをダウンロードします

urls.txtというファイルにリストURLがあります。各行には1つのURLが含まれます。 cURLを使用してすべてのファイルを一度にダウンロードしたい。正しいワンライナーを降ろせないようです。

私は試した:

$ cat urls.txt | xargs -0 curl -O

しかし、それはリストの最後のファイルのみを提供します。

72
Finch

これは私のために働く:

$ xargs -n 1 curl -O < urls.txt

私はFreeBSDにいます。 xargsは異なる動作をする場合があります。

これは、連続したcurlsを実行することに注意してください。これは不必要に重いとみなされる場合があります。そのオーバーヘッドの一部を節約したい場合は、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の動作に依存しています。すべてのスタンドアロンprintfsがこれを行うわけではありません。

この非xargsメソッドは、URLの非常に大きなリストのシステム制限に突き当たる可能性があることに注意してください。調査 ARG_MAX および MAX_ARG_STRLEN これが懸念される場合。

127
ghoti

非常に簡単な解決策は次のようになります: '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を呼び出します!

したがって、入力ファイル形式を制御できる場合、これが最も簡単なソリューションかもしれません!

26
Dirk

または、これを行うことができます:

cat urls.txt | xargs curl -O

使用する必要があるのは、-Iパラメータは、コマンドの途中にcat出力を挿入する場合に使用します。

12
user1101791

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

おそらく両方の方法を組み合わせることで最良の結果が得られるでしょうか?しかし、接続を維持するよりも並列化の方が重要だと思います。

参照: Curlコマンドラインユーティリティを使用した並列ダウンロード

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フラグを使用すると、元のファイル名が取得されます

ハッピーダウンロード!

7

他の人が正しく述べているように:

-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
3
cnst