次の構文で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.txt
にhttp://two.site.example
保存されますfile_two.txt
。
複数の変数が機能することもあります。良い:
curl http://{site,host}.host[1-5].example -o "#1_#2"
http://site.host1.example
に保存される原因site_1
、http://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
curl
Moby Dick zipファイルは上記の二重引用符の例に従ってダウンロードされます。
答え4
カールを使用して複数のファイルをダウンロードする別の方法があります。
urls="firstUrl secondUrl thirdUrl"
for url in $urls
do
curl -O "$url"
done
ノート: 必須スペースは、異なる URL を区切るために使用されます。