リモートホストでCURLを処理する必要がある何百ものテキストファイルがあります。
現在、各ファイルをダウンロードして新しいファイルに圧縮するループがあります.zip entry
。
各CURLの結果がアーカイブエントリとして使用されるように、CURLの出力をアーカイブユーティリティ(zip、gzip、tar、rarなど何でも構いません)に直接パイプできますか?
答え1
の標準出力が端末でない場合は、curl
ダウンロードしたコンテンツをファイルに書き込む代わりに端末に出力します。その後、標準入力を読み取る他のツールの機能と組み合わせることができます。複数のアイテムを含むアーカイブを作成するには、使用する名前を知らせるツールを使用する必要があります。7z
:
curl https://raw.githubusercontent.com/akka/akka/master/README.md | 7z a -siREADME.md akka.7z
curl https://raw.githubusercontent.com/akka/akka/master/RELEASING.md | 7z a -siRELEASING.md akka.7z
次のコンテンツを含むアーカイブが作成されますakka.7z
。README.md
RELEASING.md
$ 7z l akka.7z
Date Time Attr Size Compressed Name
------------------- ----- ------------ ------------ ------------------------
2019-03-06 10:15:45 ..... 3236 1457 README.md
2019-03-06 10:16:18 ..... 3001 1437 RELEASING.md
------------------- ----- ------------ ------------ ------------------------
2019-03-06 10:16:18 6237 2894 2 files
(7z
すべてのアーカイブ形式がサポートされているわけではありません。たとえば、ZIPファイルで動作させることはできません。)
答え2
-o
option(outputfile)を使用してcurl
出力ファイルを-
(「stdout」を意味するダッシュ)として指定し、必要に応じてパイプします。
~からカールマンページ:
-output <file>
Write output to <file> instead of stdout. If you are using {} or [] to fetch multiple documents, you can use '#'
followed by a number in the <file> specifier. That variable will be replaced with the current string for the URL
being fetched. Like in:
curl http://{one,two}.site.com -o "file_#1.txt"
or use several variables like:
curl http://{site,host}.host[1-5].com -o "#1_#2"
You may use this option as many times as the number of URLs you have.
See also the --create-dirs option to create the local directories dynamically. Specifying the output as '-' (a single dash) will force the output to be done to stdout.
もう少し考えてみた結果、欲しい結果が得られたようです。ダウンロードした各ファイルは、ダウンロードバッチ内のすべてのファイルを含む単一のアーカイブではなく、選択したアーカイブ/圧縮形式で保存する必要があります。私が間違っていてターゲットが単一のファイルであれば、回答~からスティーブンジッタより良い選択のようです。
あなたの目標によれば、あなたのプロセスは改善されるかもしれませんが、あなたが望むレベルまで改善することはできないと思います。出力を直接パイピングすると、curl
ファイル名が失われます。ただし、ループを介して実行する必要はありません。これにより、curl
接続を再利用する能力が減り、複数の接続/ハンドシェイク交換が防止され、速度が向上します。curl
圧縮中、ループは各ダウンロードの間でも一時停止します。組み込みの拡張機能を使用しcurl
てそれを埋める方法があるとします。
専用のダウンロード場所があり、通話前にその場所が空の場合は、curl
その場所を使用できます(以下の最初と最後のステップを削除)。それ以外の場合は、ダウンロード用の一時ディレクトリを作成する必要があります。最終ターゲットと同じディスクパーティションにある場合、「移動」は簡単で高速です。
ファイルリストが作成されると、プロセスは次のようになります。
- 一時ダウンロードディレクトリの作成
- 一度呼び出され、ファイルの完全なリストが
curl
含まれます。 curl
ファイル名を直接正確に指定し、ダウンロード場所に保存してください。find
ダウンロード場所に電話してください- ダウンロードしたすべてのファイルをアーカイブする
-exec
には、オプションを使用してください。find
- アーカイブファイルを保存場所に移動します。
単一のコマンドラインで操作を実行します。
mkdir -p temp_down &&
pushd temp_down >/dev/null &&
curl "http://www.arowtemple.com/{index,about,contact,directors,covens,temple,lessons,priesthood}.html" -o "#1.html" &&
find . -type f -exec sh -c 'zip -rms9T --move "$0.zip" "$0"' {} \; &&
popd >/dev/null
注目すべき点は、3行目と4行目に引用符を使用したことです。行3の最初の二重引用符セットは、Bashが必要なときにインポートするファイルのリストに変数を拡張し、Bashが中括弧の内容を拡張するのを防ぎます。 2番目のグループは、生成されたファイル名をシェルから安全にします。curl
中括弧の内容を展開すると、末尾'#1'
は検索された各ファイルのファイル名に置き換えられます。行4の一重引用符はサブシェルに渡されたときにコマンドを残し、二重引用符はファイル名をシェルから安全に保ちます。これらの$0
項目は印刷上のエラーではないため、意図したとおりに$1
してはいけません。
ダウンロードをすべて1つのディレクトリに収集する必要がある場合は、コマンドからそのオプションを削除できます。元のファイルとアーカイブされたバージョンを維持したい--create-dirs
場合は、コマンドcurl
からそのオプションを削除できます。--move
もちろん、このコマンドは必要なアーカイブ/圧縮プログラムに置き換えることができます。find
zip
zip