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 这只是对tar
GNU 以外的实现的预防措施,这种方式更安全,因为/var/…
如果提取存档时包含相关文件名,则不会覆盖其中的实际数据。
Nic*_*ton 13
尝试这个:
tar -cvf file.tar `find var/log/ -iname "anaconda.*"`
Run Code Online (Sandbox Code Playgroud)
您试图使用find
to -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
。
归档时间: |
|
查看次数: |
92929 次 |
最近记录: |