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