特定のURLからいくつかの.gz
ファイル(.tar.gz
ファイルではなくN.B)をダウンロードし、それらを解凍して既存のファイルがある場合は上書きしようとしています。
個々のダウンロードごとに、次のことを試しました。
curl -O $URL | gunzip -f
ただし、gzip: stdin: unexpected end of file
で失敗したため、これは機能しませんでした。 bashシェルスクリプト内で一連のこのコマンドを実行しました。
コマンドを明示的な2つの手順に分けました。つまり、最初にファイルをダウンロードし、次に.gz
ファイルを解凍すると、機能します。
パイプバージョンが機能しないのはなぜですか?
パイプ(|
シンボルで表される)は、あるプロセスの標準出力を別のプロセスの標準入力に送信します。あなたの場合、名前付きファイルを使用したいので、パイプは適切ではありません。具体的には、リモートコンテンツがローカルファイルに送信されるため、パイプするものはありません(したがってgunzip
エラーが発生します)。代わりに、たとえばURLから-ファイル名を抽出する必要があります(bashの組み込みの文字列操作機能を使用)
curl -O "$URL" && gunzip -f "${URL##*/}"
パイプを使用する場合、その方法は次のようになります
curl "$URL" | gunzip -c
(-O
オプションなし)、curl
は、リモートコンテンツをstdout
にストリーミングし、そこからgunzip
にパイプすることができますが、ターゲットの非圧縮ファイルを適切に上書きするには、gunzip
出力をリダイレクトする必要があります。
ダウンロード時にリダイレクトに従ってください。セキュリティやランダムな理由で、Webサーバーにリダイレクトが隠されている場合があります。リダイレクトに従わない場合、間違ったデータがダウンロードされ、パイプされたデータを読み取るアプリケーションが混乱します。 -Lフラグを使用してcurlでリダイレクトを追跡できます。
curl -L https://example.com/mygzip.tar.gz | tar zxv