あなたが書くとき:
tar -xf *.gz
tar コマンドは次のように認識します (例):
tar -xf abc.tar.gz def.tar.gz ghi.tar.gz
これは、def.tar.gz を抽出するリクエストとして解釈されます そして ghi.tar.gz アーカイブ abc.tar.gz から .ファイルがそこにないため、警告メッセージが表示されます。
つまり、tar 単一の tar で動作します ファイル (おそらく圧縮) を一度に (1 回の呼び出しで)。複数の tar ファイルでは動作しません。
abc.tar.gz の場合に注意してください ファイル pqr/xyz/important.c が含まれています 、指定することで 1 つのファイルだけを抽出できます:
tar -xf abc.tar.gz pqr/xyz/important.c
あなたが使用した表記法は、この表記法を変形したものにすぎません。
(もちろん、tar にする理由もあるかもしれません tar ファイル。たとえば、Gmail では、実行可能なファイルを含む tar ファイルまたは gzip 圧縮された tar ファイルを出荷することは許可されていません。ただし、圧縮されていない tar ファイル内に gzip 圧縮された tar ファイルを埋め込むと、内部ファイル内を調べて実行可能ファイルを見つけることはありません。実行可能な configure を含む tar ファイルを出荷する必要があるときにこれを使用します スクリプト)
主な理由は tar です 単一のファイル名引数を取ります。 tar *.tgz を呼び出している場合 bash は * を拡張します すべてのファイル名に tgz フォルマントを付けると tar file1 file2 file3 になります これは tar では受け入れられません .したがって、for i in *.tgz; do tar -zxvf $i ;done のような for ループを使用するか または tar を実行する他のコマンドを使用します コメントに示されているような副作用として、 ls です または find . -maxdepth 1 -name \*tgz -exec tar -zxvf {} \; (ls 出力は常に危険です)
書くとき
tar -xzf *.gz
シェルはそれを文字列に展開します:
tar -xzf 1.gz 2.gz 3.gz
(1.gz、2.gz、3.gz が現在のディレクトリにあると仮定します)。
tar 2.gz を抽出したいと考えています と 3.gz 1.gz から;アーカイブでこれらのファイルを見つけることができないため、エラー メッセージが表示されます。
ループ for を使用する必要があります コマンド xargs の ファイルを抽出します。
ls *.gz |xargs -n1 tar -xzf
つまり:tar -xzf を実行してください gzごとに -現在のディレクトリのファイル。