使用-exec选项查询ragarding Solaris find命令

时间:2009-12-08 06:46:56

标签: find solaris

我想创建包含执行find命令所产生的所有输出文件的tar文件。

我尝试了以下命令:

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

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

此致 切塔尼亚

4 个答案:

答案 0 :(得分:2)

使用命令行替换:

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

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

这使用更现代的bash表示法。如果你不使用bash,你也可以使用适用于大多数shell的反引号:

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

虽然反引号更具可移植性,但如果需要嵌套命令行替换,则$()表示法更容易。

答案 1 :(得分:1)

您希望将find找到的文件名传输到tar。

答案 2 :(得分:0)

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

但它只包含test.tar文件中最后找到的文件。

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

您可以通过将\;更改为+来查找批处理文件,但是如果还有更多 文件可以一次列出,find仍会运行多个命令,每个命令都覆盖前一个tar文件。您可以通过xargs管道输出,但它有可能多次运行该命令的问题。上面推荐的命令行替换是我所知道的最安全的方法,确保tar只能被调用一次 - 但是如果找到的文件太多,则可能会给命令行太长的错误。

答案 3 :(得分:0)

这个应该同样有效:

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

注意最后的“+”vs“\;”。

当大量文件与搜索匹配时,以可靠的方式:

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