CURL出力を名前付きアーカイブ項目に直接圧縮するにはどうすればよいですか?

CURL出力を名前付きアーカイブ項目に直接圧縮するにはどうすればよいですか?

リモートホストで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.7zREADME.mdRELEASING.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

-ooption(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もちろん、このコマンドは必要なアーカイブ/圧縮プログラムに置き換えることができます。findzipzip

関連情報