現在のディレクトリ内のすべてのファイルtar -xzf *.gzを抽出するために使用すると、エラーが発生します。ただし、1つずつ抽出するか、forループを使用すると正常に動作します.gzNot 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 が現在のディレクトリにあると仮定します)。
tar2.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 *.tgzbashを呼び出すと*、 が tgz フォルマントですべてのファイル名に拡張され、tar file1 file2 file3で受け入れられないものになりtarます。したがって、forループのようなものを使用するか、コメントに示されているように副作用としてfor i in *.tgz; do tar -zxvf $i ;done実行される他のコマンドを使用するか、または(出力は常に危険です)tarlsfind . -maxdepth 1 -name \*tgz -exec tar -zxvf {} \;ls