你怎么能一次解压一个以上的文件?
我有一堆目录中的tar
文件,我想一次从中提取所有的文件。 但是这似乎没有做任何事情:
$ tar xf *.tar
这里发生了什么? 我该如何解开一堆文件?
这里发生了什么?
最初, tar
命令是用于磁带设备的。 由于一次只在一个设备上执行tar
是有意义的,因此语法被devise为假定一个且仅有一个设备。 通过的第一个文件或目录被认为是保存有问题档案的设备,以及其中包含在操作中的档案内容的任何其他文件或目录。 因此,对于tar
提取( x
选项),传递的第一个文件将是存档,所有其他文件将是要提取的文件。 所以如果有两个*.tar
文件(比如说a.tar
和b.tar
),你的命令将会扩展为:
$ tar xf a.tar b.tar
除非a.tar
包含一个名为b.tar
的文件,否则tar
命令无关并且安静地退出。 令人烦恼的是,Solaris版本的tar
不会在返回码或详细选项( v
)中报告任何问题。 与此同时,即使closures了详细选项, GNU tar
也会返回2
并且会对STDERR
进行垃圾回收:
tar: b.tar: Not found in archive tar: Exiting with failure status due to previous errors
我该如何解开一堆文件?
重写tar
以接受多个存档文件作为input已经太晚了,但是解决这个限制并不难。
对于大多数人来说,多次运行tar
多个档案是最方便的select。 只传递一个文件名到tar xf
将会提取所有的存档文件。 一种方法是使用shell for
循环:
$ for f in *.tar; do tar xf $f; done
另一种方法是使用xargs
:
$ ls *.tar | xargs -i tar xf {}
或者,您可以使用多种替代tar
文件阅读器之一 。 最后,真正的专业程序员可以轻松地编写一个完全按照需要工作的tar
替代品。 格式很简单,许多编程语言都有可用于读取tar
文件的库。 例如,如果您是Perl程序员,请查看Archive::Tar
模块。
一个警告
盲目地解开一堆文件可能会导致意想不到的问题。 最明显的是一个特定的文件名可能被包含在多个tar
文件中。 由于tar
默认会覆盖文件,所以最终文件的确切版本取决于档案处理的顺序。 更麻烦的是,如果你尝试这个“聪明”的优化,你最终可能会损坏文件的副本:
for f in *.tar; do tar xf $f & done wait
如果a.tar
和b.tar
都包含相同的文件并尝试同时提取它,则结果是不可预知的。
一个相关的问题,特别是从一个不受信任的来源档案,是一个tarbomb的可能性。
一个部分的解决scheme是自动创build一个新的目录提取到:
for f in *.tar; do d=`basename $f .tar` mkdir $d (cd $d && tar xf ../$f) done
如果文件在绝对path(这通常是恶意意图的标志)中指定的文件,这将无济于事。 添加这种检查是作为读者的练习。
find . -maxdepth 1 -name '*.tar' -exec tar -xf '{}' \;
如果所有的tar文件都在同一个文件夹中,那么我在tcsh shell中这样做。 一直工作。
find -iname \*.tar -exec tar -xvf {} \;
这和上面的答案是一样的,我觉得更简洁一点。