我想创建带有执行find
命令后产生的所有输出文件的tar文件。查询ragarding Solaris查找带-exec选项的命令
我尝试下面的命令:
find . \(-name "*.log" -o -name "*.log.*" \) -mtime +7 -exec tar cvf test.tar.gz {} \;
但它仅包括在test.tar
文件的最后一个找到的文件。如何在test.tar
文件中包含所有文件?
问候 切塔尼亚
我想创建带有执行find
命令后产生的所有输出文件的tar文件。查询ragarding Solaris查找带-exec选项的命令
我尝试下面的命令:
find . \(-name "*.log" -o -name "*.log.*" \) -mtime +7 -exec tar cvf test.tar.gz {} \;
但它仅包括在test.tar
文件的最后一个找到的文件。如何在test.tar
文件中包含所有文件?
问候 切塔尼亚
使用命令行替换:
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`
虽然反引号更便携,$()符号是比较容易,如果你需要嵌套的命令行替换。
你想通过管道将找到焦油中找到的文件名。
是。你是对的。 – 2009-12-08 07:16:33
find . \(-name "*.log" -o -name "*.log.*" \) -mtime +7 -exec tar cvf test.tar.gz {} \;
但它仅包括在test.tar文件的最后一个找到的文件。
这是因为对于每个文件,它都会发现它正在运行一个新的tar命令,该命令会覆盖上一个命令中的tar文件。
您可以通过改变\;
到+
使发现一批文件一起,但如果有更多的 文件不是可以一次上市,发现仍然会运行多个命令,每个覆盖从以前的一个tar文件。您可以通过xargs管道输出,但它有可能多次运行该命令的相同问题。上面建议的命令行替换是我知道的最安全的方法,确保tar只能被调用一次 - 但是如果找到太多文件,它可能会导致命令行过长的错误。
这应该平等合作:
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
这受制于shell扩展缓冲区的大小限制 - 这就是管道避免的情况。 – Don 2009-12-08 14:41:20