使用正则表达式时,Shell'tar:在存档中找不到'错误

时间:2013-06-05 06:43:15

标签: linux shell tar

当我使用tar -xzf *.gz提取当前目录中的所有.gz文件时,出现Not found in archive错误。但是,如果我逐个提取或使用像

这样的for循环,它可以正常工作
for file in `ls *.gz`; do tar -xzf $file; done

出现此错误的原因是什么?

3 个答案:

答案 0 :(得分:24)

当你写:

tar -xf *.gz

tar命令看到(例如):

tar -xf abc.tar.gz def.tar.gz ghi.tar.gz

这被解释为从档案def.tar.gz中提取ghi.tar.gzabc.tar.gz的请求。由于文件不在那里,您会收到警告消息。

换句话说,tar一次对一个tar文件(可能是压缩的)进行操作(在一次调用中)。它不能在多个tar文件上运行。

请注意,如果abc.tar.gz包含文件pqr/xyz/important.c,您只需指定以下内容即可提取一个文件:

tar -xf abc.tar.gz pqr/xyz/important.c

您使用的符号只是此符号的变体。

(是的,可能有tartar文件的原因。例如,Gmail不允许您发送包含可执行文件的tar文件或gzipped tar文件但是,如果你在一个非压缩的tar文件中嵌入了一个gzipped tar文件,它就不会查看内部文件中的内容来查找可执行文件。当我需要发送一个带有可执行文件的{{1} tar文件时,我会使用它} script。)

答案 1 :(得分:24)

写作时

 tar -xzf *.gz

你的shell将它扩展为字符串:

 tar -xzf 1.gz 2.gz 3.gz

(假设1.gz,2.gz和3.gz在你当前目录中)。

tar认为您要从2.gz中提取3.gz1.gz;他无法在档案中找到这些文件并导致错误消息。

您需要使用命令for的循环xargs来提取文件。

ls *.gz |xargs -n1 tar -xzf

这意味着:为当前目录中的每个tar -xzf文件运行gz

答案 2 :(得分:3)

主要原因是tar采用单个文件名参数。当您致电tar *.tgz时,bash会将*扩展为使用tgz共振峰的所有文件名,并且tar file1 file2 file3不会被tar接受。因此,要么使用像for i in *.tgz; do tar -zxvf $i ;done这样的for循环,要么使用执行tar的其他命令作为注释中显示的副作用,lsfind . -maxdepth 1 -name \*tgz -exec tar -zxvf {} \;({{1输出总是有风险的)