unix – 如何一次解开多个文件?

前端之家收集整理的这篇文章主要介绍了unix – 如何一次解开多个文件?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个tar文件在一个目录,我想要从它们一次提取所有的文件。但这似乎没有做任何事情:
$ tar xf *.tar

这里发生了什么?如何立即解开一堆文件

这里发生了什么?

最初,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

如果在归档中使用绝对路径(通常是恶意意图的符号)指定文件,这将无济于事。添加这种检查留给读者做练习。

原文链接:https://www.f2er.com/bash/390225.html

猜你在找的Bash相关文章