2009-12-08 154 views
1

我想创建带有执行find命令后产生的所有输出文件的tar文件。查询ragarding Solaris查找带-exec选项的命令

我尝试下面的命令:

find . \(-name "*.log" -o -name "*.log.*" \) -mtime +7 -exec tar cvf test.tar.gz {} \; 

但它仅包括在test.tar文件的最后一个找到的文件。如何在test.tar文件中包含所有文件?

问候 切塔尼亚

回答

2

使用命令行替换:

tar cf test.tar $(find . \(-name "*.log" -o -name "*.log.*" \) -mtime +7) 

这样做是在$运行命令(),使输出的外部命令的命令行参数。

这使用更现代的bash符号。如果您不使用bash,你也可以使用这应该与大多数弹工作反引号:

tar cf test.tar `find . \(-name "*.log" -o -name "*.log.*" \) -mtime +7` 

虽然反引号更便携,$()符号是比较容易,如果你需要嵌套的命令行替换。

+0

这受制于shell扩展缓冲区的大小限制 - 这就是管道避免的情况。 – Don 2009-12-08 14:41:20

1

你想通过管道将找到焦油中找到的文件名。

+0

是。你是对的。 – 2009-12-08 07:16:33

0
find . \(-name "*.log" -o -name "*.log.*" \) -mtime +7 -exec tar cvf test.tar.gz {} \; 

但它仅包括在test.tar文件的最后一个找到的文件。

这是因为对于每个文件,它都会发现它正在运行一个新的tar命令,该命令会覆盖上一个命令中的tar文件。

您可以通过改变\;+使发现一批文件一起,但如果有更多的 文件不是可以一次上市,发现仍然会运行多个命令,每个覆盖从以前的一个tar文件。您可以通过xargs管道输出,但它有可能多次运行该命令的相同问题。上面建议的命令行替换是我知道的最安全的方法,确保tar只能被调用一次 - 但是如果找到太多文件,它可能会导致命令行过长的错误。

0

这应该平等合作:

find . -name "*.log" -o -name "*.log.*" -mtime +7 -exec tar cvf test.tar {} + 

注意 “+” 末与 “\;”。

对于一个可靠的方式,当一个非常大的数字文件将符合搜索:

find . -name "*.log" -o -name "*.log.*" -mtime +7 > /tmp/find.out 
tar cvf test.tar -I /tmp/find.out