.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
- 強制的に宛先ディレクトリを作成します
- 指定されたディレクトリにアーカイブを解凍します
- アーカイブのルート ディレクトリを削除するだけで、ルート ディレクトリを指定されたディレクトリ名に置き換えます。