web-dev-qa-db-ja.com

正規表現を使用する場合のシェル「tar:アーカイブに見つかりません」エラー

tar -xzf *.gzを使用して現在のディレクトリ内のすべての.gzファイルを抽出すると、Not found in archiveエラーが発生します。ただし、1つずつ抽出するか、次のようなforループを使用するとうまくいきます

for file in `ls *.gz`; do tar -xzf $file; done

このエラーの理由は何ですか?

23
Zhiwen Fang

あなたが書くとき:

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ファイルを出荷する必要があるときに使用します。 )

25

書くとき

 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-ファイルに対して。

25
Igor Chubin

主な理由は、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出力は常に危険です)

3
abasu