あなたが書くとき:
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
ごとに -現在のディレクトリのファイル。