如何将'tar'命令与'find'结合起来

Modified on: Sun, 10 Feb 2019 21:00:02 +0800

find命令给出了这个输出:

[root@localhost /]# find var/log/ -iname anaconda.*
var/log/anaconda.log
var/log/anaconda.xlog
var/log/anaconda.yum.log
var/log/anaconda.syslog
var/log/anaconda.program.log
var/log/anaconda.storage.log

与tar结合后,显示此输出:

[root@localhost /]# find var/log/ -iname anaconda.* -exec tar -cvf file.tar {} \;
var/log/anaconda.log
var/log/anaconda.xlog
var/log/anaconda.yum.log
var/log/anaconda.syslog
var/log/anaconda.program.log
var/log/anaconda.storage.log

但是在列出tar文件时,它只显示一个文件

[root@localhost /]# tar -tvf file.tar
-rw------- root/root    208454 2012-02-27 12:01 var/log/anaconda.storage.log

我在这里做错了什么?

使用xargs我得到了这个输出:

  

[root @ localhost /] #find var / log / -iname anaconda。* | xargs tar -cvf file1.tar

第二个问题

在var前面输入/时,意味着find /var/log为什么它会给出这个mesaage tar:从成员名称中删除前导“/” /强>

[root@localhost /]# find /var/log/ -iname anaconda.* -exec tar -cvf file.tar {} \;
tar: Removing leading `/' from member names
/var/log/anaconda.log
tar: Removing leading `/' from member names
/var/log/anaconda.xlog
tar: Removing leading `/' from member names
/var/log/anaconda.yum.log
tar: Removing leading `/' from member names
/var/log/anaconda.syslog
tar: Removing leading `/' from member names
/var/log/anaconda.program.log
tar: Removing leading `/' from member names
/var/log/anaconda.storage.log

以简单的形式,以下两者之间有什么区别?

find var/logfind /var/log

最佳答案

请注意,find将为找到的每个文件调用-exec操作。

如果您为每个tar -cvf file.tar {}输出运行find,这意味着您将覆盖file.tar每次,这解释了为什么你最终只留下一个只包含anaconda.storage.log的档案 - 这是最后一个文件find输出。

现在,您实际上希望文件附加到存档而不是每次都创建它(这是-c选项所做的)。因此,请使用以下内容:

find var/log/ -iname "anaconda.*" -exec tar -rvf file.tar {} \;

-r选项附加到存档,而不是每次都重新创建。

注意:-iname anaconda.*替换为-iname "anaconda.*"。星号是一个通配符,在find之前,你的shell可以展开。要阻止此扩展,请将参数用双引号括起来。 子>


至于删除前导tar/:存档应该只包含相对文件名。如果您添加了带有前导/的文件,它们将被存储为绝对文件名,字面意思是您计算机上的/var/…,例。

IIRC这只是对GNU以外的tar实现的预防措施,而且这种方式更安全,因为你不会在/var/…中覆盖你的实际数据。如果存档包含相对文件名,则提取存档。

作者:,slhck

相关问答

添加新评论