curl .gzファイルとそれを解凍のためにパイプする


13

特定のURLからいくつかの.gzファイル(NBではありません.tar.gz)をダウンロードし、それらを解凍して既存のファイルがある場合は上書きしようとしています。

個々のダウンロードごとに、次のことを試しました。

curl -O $URL | gunzip -f

ただし、次の場合に失敗したため、これは機能しませんでしたgzip: stdin: unexpected end of file。この一連のコマンドをbashシェルスクリプト内で実行しました。

コマンドを2つの明示的なステップ、つまり最初にファイルをダウンロードし、次に.gzファイルを解凍するステップに分割した場合、機能します。

パイプバージョンが機能しないのはなぜですか?


1
あなたは確認していますcurl -O実際には標準出力にファイルをストリーミング?おそらくあなたは考えているwget -O-
スチールドライバー14年

@steeldriverあなたはそれを回答カールとして投稿する必要があります| タールXZ ...
パンサー

もありますが--compressed、これは圧縮された応答に対してのみ機能します。
ケノーブ

回答:


18

パイプ(|記号で表される)は、1つのプロセスの標準出力標準入力に送信します別のです。あなたの場合、名前付きファイルを使用したいので、パイプは適切ではありません。具体的にはgunzip、リモートコンテンツがローカルファイルに送信されるため、パイプすることはありません(したがって、エラーが発生します)。代わりに、たとえばURLからファイルの名前を抽出する必要があります(bashの組み込みの文字列操作機能を使用)

curl -O "$URL" && gunzip -f "${URL##*/}"

パイプを使用する場合、その方法は次のようになります

curl "$URL" | gunzip -c

-Oオプションなし)を使用してcurl、リモートコンテンツをstdoutにパイプできる場所にストリームしgunzipますが、gunzip出力をリダイレクトして、必要に応じてターゲットの非圧縮ファイルを上書きする必要があります。


5

ダウンロード時にリダイレクトに従ってください。セキュリティやランダムな理由で、Webサーバーにリダイレクトが隠されている場合があります。リダイレクトに従わないと、間違ったデータがダウンロードされ、パイプされたデータを読み取るアプリケーションが混乱します。-Lフラグを使用してcurlでリダイレクトを追跡できます。

curl -L https://example.com/mygzip.tar.gz | tar zxv
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.