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