当我使用tar -xzf *.gz
提取.gz
当前目录中的所有文件时,Not found in archive
出现错误。但是,如果我一个一个地提取或使用类似的 for 循环,它就可以正常工作
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
and ; 它在档案中找不到这些文件,这会导致错误消息。3.gz
1.gz
您需要使用for
命令循环xargs
来提取文件。
ls *.gz |xargs -n1 tar -xzf
这意味着:为当前目录中的tar -xzf
每个-file 运行我。gz
当你写:
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
对单个文件(可能已压缩)进行操作。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 文件时,我会使用它。)
主要原因是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
输出总是有风险的)