40

当我使用tar -xzf *.gz提取.gz当前目录中的所有文件时,Not found in archive出现错误。但是,如果我一个一个地提取或使用类似的 for 循环,它就可以正常工作

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

这个错误的原因是什么?

4

3 回答 3

53

当你写

 tar -xzf *.gz

您的外壳将其扩展为字符串:

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

(假设 1.gz、2.gz 和 3.gz 在您的当前目录中)。

tar认为你想提取2.gzand ; 它在档案中找不到这些文件,这会导致错误消息。3.gz1.gz

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

ls *.gz |xargs -n1 tar -xzf

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

于 2013-06-05T06:57:31.870 回答
39

当你写:

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

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

tar(是的,文件可能有原因tar。例如,Gmail 不允许您发送包含可执行文件的 tar 文件或 gzip 压缩的 tar 文件。但是,如果您将 gzip 压缩的 tar 文件嵌入到非-压缩的 tar 文件,它不会在内部文件中查找可执行文件。当我需要发送带有可执行configure脚本的 tar 文件时,我会使用它。)

于 2013-06-05T06:57:30.663 回答
5

主要原因是tar采用单个文件名参数。当您调用tar *.tgzbash 将*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输出总是有风险的)

于 2013-06-05T07:00:03.427 回答