当我使用tar -xzf *.gz
命令提取当前目录下所有 .gz
文件时,会出现Not found in archive
错误。但是,如果逐个提取或使用for循环,则可以正常运行。
for file in `ls *.gz`; do tar -xzf $file; done
这个错误的原因是什么?
tar -xzf *.gz
你的shell会将其扩展为字符串:
tar -xzf 1.gz 2.gz 3.gz
(假设您当前目录中有1.gz、2.gz和3.gz文件。)
tar
认为您想从1.gz
中提取2.gz
和3.gz
;由于档案中找不到这些文件,因此会导致错误信息。
您需要使用xargs
命令的循环for
来提取您的文件。
ls *.gz |xargs -n1 tar -xzf
这意味着:对于当前目录中的每个gz
文件,请运行tar -xzf
命令。
当你写:
tar -xf *.gz
tar
命令看到的内容举例:
tar -xf abc.tar.gz def.tar.gz ghi.tar.gz
这被解释为从归档文件abc.tar.gz
中提取def.tar.gz
和ghi.tar.gz
,但由于文件不在其中,您会收到警告消息。tar
一次仅操作单个tar
文件(可能已压缩)。它不操作多个tar文件。abc.tar.gz
包含一个文件pqr/xyz/important.c
,则可以通过指定以下内容仅提取一个文件:tar -xf abc.tar.gz pqr/xyz/important.c
你使用的符号只是此符号的变体。
(是的,有时会有压缩文件中包含压缩文件的情况。例如,Gmail不允许您发送包含可执行文件的tar文件或gzipped tar文件。但是,如果将一个gzipped 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
的输出始终存在风险)。ls
命令的输出是不明确的。对于没有空格的名称(包括没有换行符的),这没问题,但是现在不能依赖没有空格的名称。 - Jonathan Lefflerfor i in *.tgz; do tar -zxvf "$i" ;done
更好地工作。 - rjpj1998
ls *.gz |xargs -n1 tar -xzf
或类似命令)。 - ShinTakezou*.gz
符号;tar
不会(通常)看到*.gz
。有时,您想提取名称中带有*
的文件。例如:tar -xf abc.tar.gz 'src/prog/*name.*'
将提取诸如src/prog/bigname.c
、src/prog/smallname.h
等文件;单引号防止 shell 扩展*
,而tar
确实扩展它。 - Jonathan Lefflertar -xzf *.gz
会像其他接受更多文件的命令一样工作,但是tar将“其余部分”解释为其他内容,即tar -xzf 1.gz 2.gz 3.gz
只会将1.gz视为“tar”。我忘记指定shell的扩展,但很明显我假设了它。第二条评论回答了现在已删除的评论,该评论建议转义“”(以避免shell扩展)。因此,我指出对于tar来说,“.gz”不是全局模式,除非它解释它,而且据我所知它不会这样做。 - ShinTakezou