我想创建包含执行find
命令所产生的所有输出文件的tar文件。
我尝试了以下命令:
find . \(-name "*.log" -o -name "*.log.*" \) -mtime +7 -exec tar cvf test.tar.gz {} \;
但它只包含test.tar
文件中最后找到的文件。如何在test.tar
文件中包含所有文件?
此致 切塔尼亚
答案 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