max*_*max 38 linux centos find exec
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为什么它会给出此消息tar:从成员名称中删除前导 `/'
[root@localhost /]# find /var/log/ -iname anaconda.* -exec tar -cvf file.tar {} \;
tar:从成员名称中删除前导“/”
/var/log/anaconda.log
tar:从成员名称中删除前导“/”
/var/log/anaconda.xlog
tar:从成员名称中删除前导“/”
/var/log/anaconda.yum.log
tar:从成员名称中删除前导“/”
/var/log/anaconda.syslog
tar:从成员名称中删除前导“/”
/var/log/anaconda.program.log
tar:从成员名称中删除前导“/”
/var/log/anaconda.storage.log
以简单的形式,以下两者有什么区别?
find var/log 和 find /var/log
小智 53
您可以使用以下内容:
find var/log -iname 'anaconda.*' -print0 | tar -cvf somefile.tar --null -T -
Run Code Online (Sandbox Code Playgroud)
在-print0和-T工作在一起,以允许用空格换行符等文件名的最后-告诉tar从stdin读取输入文件名。
请注意,-print0必须出现在您的陈述末尾,根据此答案。否则,您可能会获得比预期更多的文件。
slh*_*hck 43
注意:有关更有效的解决方案,请参阅@Iain 的回答。
请注意,find它将为其找到的每个文件调用该-exec操作。
如果您tar -cvf file.tar {}为每个文件find输出运行,这意味着您file.tar每次都会覆盖,这解释了为什么您最终只剩下一个存档anaconda.storage.log- 它是最后一个文件find输出。
现在,您实际上希望将文件附加到存档中,而不是每次都创建它(这就是该-c选项的作用)。因此,请使用以下内容:
find var/log/ -iname "anaconda.*" -exec tar -rvf file.tar {} \;
Run Code Online (Sandbox Code Playgroud)
该-r选项会附加到存档中,而不是每次都重新创建。
注意:替换-iname anaconda.*为-iname "anaconda.*". 星号是一个通配符,甚至可以在你看到它之前被你的 shell扩展find。为防止这种扩展,请将参数用双引号括起来。
至于tar删除前导/:存档应该只包含相对文件名。例如,如果您添加带有前导 的文件/,它们将被存储为绝对文件名,字面意思/var/…是您的计算机。
IIRC 这只是对tarGNU 以外的实现的预防措施,这种方式更安全,因为/var/…如果提取存档时包含相关文件名,则不会覆盖其中的实际数据。
Nic*_*ton 13
尝试这个:
tar -cvf file.tar `find var/log/ -iname "anaconda.*"`
Run Code Online (Sandbox Code Playgroud)
您试图使用findto -exec tar。但是该-exec选项的工作方式是,它为找到的每个匹配文件运行一次该命令,从而导致tar每次都覆盖它生成的 tar 文件。这就是为什么你只得到了最后一个。此外,您需要在指定的模式周围加上引号,find以便 shell 在将其传递给find.
使用带反引号的命令替换(或使用$(...)符号,如果您愿意),由 产生的整个名称列表将find作为参数粘贴回命令行tar,使其一次性写入所有名称。
您的命令失败,因为tar正在获取找到的每个文件并将它们归档到file.tar. 每次这样做时,它都会覆盖之前创建的file.tar.
如果您想要的是一个包含所有文件的存档,那么只需tar直接运行,就不需要find(是的,这适用于名称中带有空格的文件):
tar -vcf file.tar /var/log/anaconda*
Run Code Online (Sandbox Code Playgroud)
这两个命令完全不同:
find var/log 将搜索一个名为的var/log 目录,它是您当前目录的子目录,它相当于find ./var/log(注意./)。
find /var/log 将搜索一个名为的目录/var/log ,它是根目录/.
主要/信息来自tar,而不是find。这意味着它正在删除/您的第一个文件名以使绝对路径成为相对路径。这意味着当您解压缩存档时,文件 from/var/log/anaconda.error将被提取到./var/log/anaconda.error。