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文件中。由于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 如果在归档中使用绝对路径(通常是恶意意图的符号)指定文件,这将无济于事。添加这种检查留给读者做练习。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |