1. ホーム
  2. unix

[解決済み] cat の出力を cURL にパイプし、ファイルのリストをダウンロードする

2023-04-13 17:12:35

質問

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

試してみました。

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

しかし、これではリストの最後のファイルしか得られません。

どのように解決するのですか?

これは私のために動作します。

$ 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 ]内の文字は、シェルとの相互作用を避けるためにエスケープする必要がある場合があることに注意してください。

あるいは、bashではなくPOSIXシェルを使用している場合。

$ curl $(printf ' -O %s' $(cat urls.txt))

これは printf は、データ引数のリストを使い切るためにフォーマットパターンを繰り返すという挙動に依存しています。 printf はこれを行います。

この非xargsメソッドは、非常に大きなURLのリストに対してシステムの制限にぶつかる可能性があることに注意してください。研究 ARG_MAX MAX_ARG_STRLEN を追加してください。