.gz ファイルを curl し、パイプで解凍する

.gz ファイルを curl し、パイプで解凍する

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

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

curl -O $URL | gunzip -f

しかし、これは次のように失敗し、機能しませんでしたgzip: stdin: unexpected end of file。bash シェル スクリプト内でこのコマンドのシリーズを実行しました。

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

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

答え1

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

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

パイプを使いたい場合、次のような方法があります。

curl "$URL" | gunzip -c

( オプションなし-O) では、curlから にリモート コンテンツをストリームし、stdoutそこから にパイプすることができますが、その場合、出力をリダイレクトして、適切なターゲットの非圧縮ファイルを上書きするgunzip必要があります。gunzip

答え2

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

curl -L https://example.com/mygzip.tar.gz | tar zxv

答え3

以下は3つのことを行います

    mkdir -p ${DIR} && curl -L http://apachemirror.wuchna.com/spark/spark-2.4.5/spark-2.4.5-bin-hadoop2.7.tgz | tar zxv -C ${DIR} --strip-components 1
  1. 強制的に宛先ディレクトリを作成します
  2. 指定されたディレクトリにアーカイブを解凍します
  3. アーカイブのルート ディレクトリを削除するだけで、ルート ディレクトリを指定されたディレクトリ名に置き換えます。

関連情報