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

Zhi*_*ang 23 linux shell tar

当我tar -xzf *.gz用来提取.gz当前目录中的所有文件时,我收到Not found in archive错误.但是,如果我逐个提取或使用for循环,它可以正常工作

for file in `ls *.gz`; do tar -xzf $file; done
Run Code Online (Sandbox Code Playgroud)

这个错误的原因是什么?

Igo*_*bin 30

当你写作

 tar -xzf *.gz
Run Code Online (Sandbox Code Playgroud)

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

 tar -xzf 1.gz 2.gz 3.gz
Run Code Online (Sandbox Code Playgroud)

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

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

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

ls *.gz |xargs -n1 tar -xzf
Run Code Online (Sandbox Code Playgroud)

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


Jon*_*ler 26

当你写:

tar -xf *.gz
Run Code Online (Sandbox Code Playgroud)

tar命令看到(例如):

tar -xf abc.tar.gz def.tar.gz ghi.tar.gz
Run Code Online (Sandbox Code Playgroud)

这被解释为从存档中提取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
Run Code Online (Sandbox Code Playgroud)

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

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


aba*_*asu 5

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