当我使用tar -xzf *.gz
提取当前目录中的所有.gz
文件时,出现Not found in archive
错误。但是,如果我逐个提取或使用像
for file in `ls *.gz`; do tar -xzf $file; done
出现此错误的原因是什么?
答案 0 :(得分:24)
当你写:
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文件或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.gz
和1.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
的其他命令作为注释中显示的副作用,ls
或find . -maxdepth 1 -name \*tgz -exec tar -zxvf {} \;
({{1输出总是有风险的)