カールは中括弧構文を使用して複数のファイルをダウンロードします。

カールは中括弧構文を使用して複数のファイルをダウンロードします。

次の構文で2つのファイルをダウンロードしようとしています。

curl -O http://domain/path/to/{file1,file2}

問題は、最初のファイルだけが実際にローカルに保存され、2番目のファイルが標準出力として印刷されることです。

-O以下を追加すると正しく機能することに気づきました。

curl -OO http://domain/path/to/{file1,file2}

しかし、ファイルの数が多すぎると実用的ではありませんか?例えば、

curl -O http://domain/path/to/file[1,100]

curl私の質問は、(正しい番号を追加せずに)複数の個々のファイルを一度にダウンロードする方法が本当にないのでしょうか-O

答え1

このオプションは、カールが各ファイルで--remote-name-all使用されるかのように動作するように指示します。したがって、このコマンドは問題を解決します。-O--remote-name

curl --remote-name-all http://domain/path/to/{file1,file2}

引用するここ

このオプションはリリース以来利用可能でした。バージョン 7.19.0

答え2

これはカール7.19.0で実装されました。 @Besworksの回答をご覧ください。

マニュアルページによると、複数のsを使用する以外に元のファイル名を保存する方法はありませんO。あるいは、独自のファイル名を使用することもできます。

curl http://{one,two}.site.example -o "file_#1.txt"

http://one.site.exampleに保存され、file_one.txthttp://two.site.example保存されますfile_two.txt

複数の変数が機能することもあります。良い:

curl http://{site,host}.host[1-5].example -o "#1_#2"

http://site.host1.exampleに保存される原因site_1http://host.host1.exampleに保存される原因host_1などです。

答え3

ここでの問題は、シェル(おそらくBASH)がコマンドを解釈する方法ですcurl

基本的に見ると

curl -O http://domain/path/to/{file1,file2}

次に展開します。

curl -O http://domain/path/to/file1 http://domain/path/to/file2

フラグは-O最初のインスタンスにのみ適用され、それ以降のインスタンスには適用されないため問題になります。

この問題は、URLを二重引用符で囲むことで解決できます。

curl -O "http://domain/path/to/{file1,file2}"

Curlチームはこれを認めました。GitHubマンページだけでなく公式カールマニュアルコミットされるため、将来の一部のシェルでこれらの潜在的なグロービング動作を反映する必要があります。

この失敗と解決策を確認するための簡単なテストケースが必要な場合は、2つの.txtファイルを含むzipファイルをダウンロードしてみてください。モビディック~からプロジェクト グーテンベルク

ランニング:

curl -O https://www.gutenberg.org/files/2701/2701-{0,h}.zip

次の応答が提供されます。

% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 500k 100 500k 0 0 380k 0 0:00:01 0:00:01 --:--:-- 380k Warning: Binary output can mess up your terminal. Use "--output -" to tell Warning: curl to output it to your terminal anyway, or consider "--output Warning: <FILE>" to save to a file.

(抽出したファイルが生テキストの場合は、標準出力(おそらく画面)にダンプされます。モビディックこれが .zip ファイルが代わりに使用される理由です。 )

ランニング:

curl -O "https://www.gutenberg.org/files/2701/2701-{0,h}.zip"

次のような出力が提供されます。

[1/2]: https://www.gutenberg.org/files/2701/2701-0.zip --> 2701-0.zip --_curl_--https://www.gutenberg.org/files/2701/2701-0.zip % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 500k 100 500k 0 0 407k 0 0:00:01 0:00:01 --:--:-- 407k

[2/2]: https://www.gutenberg.org/files/2701/2701-h.zip --> 2701-h.zip --_curl_--https://www.gutenberg.org/files/2701/2701-h.zip % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 522k 100 522k 0 0 1000k 0 --:--:-- --:--:-- --:--:-- 1000k

この問題は{ }ワイルドカードを使用している場合にのみ発生します。使用する場合は[ ]二重引用符は必要ありません。

参考までに、インストールされているwget場合は引用符なしでワイルドカードを処理できます。

ランニング:

wget http://domain/path/to/{file1,file2}

両方のファイルが存在する場合、プルダウンされます。

ランニング:

wget https://www.gutenberg.org/files/2701/2701-{0,h}.zip

curlMoby Dick zipファイルは上記の二重引用符の例に従ってダウンロードされます。

答え4

カールを使用して複数のファイルをダウンロードする別の方法があります。

urls="firstUrl secondUrl thirdUrl" 
for url in $urls
do
   curl -O "$url"
done

ノート: 必須スペースは、異なる URL を区切るために使用されます。

関連情報