最初,tar命令旨在用于磁带设备。由于每次在一个设备上执行tar只是有意义的,所以语法被设计为假设一个且只有一个设备。传递的第一个文件或目录被假定为保存有问题的存档的设备以及要包括在操作中的存档内容的任何其他文件或目录。因此,对于tar提取(x选项),传递的第一个文件将是存档,所有其他文件将是要提取的文件。因此,如果有两个* .tar文件(说a.tar和b.tar),您的命令将扩展为:
$ tar xf a.tar b.tar
除非a.tar包含一个名为b.tar的文件,tar命令没有什么可做,并静静退出。令人遗憾的是,Solaris版本的tar不会在返回码或verbose选项(v)中报告任何问题。同时,GNU tar返回2,并且spams STDERR,即使verbose选项关闭:
tar: b.tar: Not found in archive tar: Exiting with failure status due to prevIoUs errors
如何立即解开一堆文件?
它太晚重写tar接受多个归档文件作为输入,但它不是太难解决这个限制。
对于大多数人来说,对多个存档多次运行tar是最方便的选择。只传递一个文件名到tar xf将提取所有的归档文件,如预期。一种方法是使用shell for循环:
$ for f in *.tar; do tar xf $f; done
另一种方法是使用xargs:
$ ls *.tar | xargs -i tar xf {}
或者,您可以使用多个alternative tar
file readers中的一个。最后,真正专用的程序员可以轻松地写一个tar替换,完全按照需要工作。 format是直接的,许多编程语言都有可用于读取tar文件的库。例如,如果你是一个Perl程序员,看看Archive::Tar
模块。
一个警告
盲目解开一堆文件可能会导致意外的问题。最明显的是,一个特定的文件名可能包含在多个tar文件中。由于tar默认覆盖文件,因此您最终使用的文件的确切版本将取决于归档的处理顺序。更麻烦的是,如果你尝试这个“聪明”的优化,你可能会得到一个损坏的文件副本:
for f in *.tar; do tar xf $f & done wait
如果a.tar和b.tar包含相同的文件,并尝试同时提取它,结果是不可预测的。
一个相关的问题,特别是当从不受信任的来源采取档案时,是一个tarbomb的可能性。
for f in *.tar; do d=`basename $f .tar` mkdir $d (cd $d && tar xf ../$f) done