![如何在 find -exec 中使用 tar‘--remove-files’选项?](https://linux22.com/image/1427640/%E5%A6%82%E4%BD%95%E5%9C%A8%20find%20-exec%20%E4%B8%AD%E4%BD%BF%E7%94%A8%20tar%E2%80%98--remove-files%E2%80%99%E9%80%89%E9%A1%B9%EF%BC%9F.png)
我有许多非常大的日志文件需要压缩单独地所以我不能使用 xargs 或管道 stdout 来获取巨大的压缩文件。
我正在尝试这样做:
find . -mtime +1 -iname "*.log" -exec tar -jcvf {} --remove-files \;
但我明白:
tar: Cowardly refusing to create an empty archive
Try `tar --help' or `tar --usage' for more information.
我尝试转义双破折号(--),我认为这是问题所在,但无济于事。
是的,find 确实找到了一个文件:
find . -mtime +1 -iname "*.log"
./20141002.tcp.log # just a test file...
谁能告诉我我做错了什么?
谢谢!
答案1
Tar
抱怨是因为您错过了将参数传递给其-f
选项的机会,而不是因为--
您怀疑了什么。
这是一种修复命令的方法,GNU tar
它可能与您所使用的命令兼容:
find . -mtime +1 -iname "*.log" -exec tar --remove-files -jcvf {}.tar.bz2 {} \;
如果你的find
实现想要{}
保持独立,就像 POSIX 标准指定的那样,你可以运行:
find . -mtime +1 -iname "*.log" -exec sh -c 'tar --remove-files -jcvf $1.tar.bz2 $1' sh {} \;
答案2
为了完整起见,我将回答我自己的问题。
由于无法在压缩时删除源文件,我只能编写一个小脚本来手动删除它们。虽然不是很高级,但运行在 cron 中,效果很好:我的卷占用率从 60% 降到了 10%。
这是脚本
#!/bin/bash
find /var/log/remote -mtime +1 -iname "*.log" > /tmp/tmp_file
for i in $(cat /tmp/tmp_file) ; do tar jcvf $i.bz2 $i && rm -rf $i ; done
rm -rf /tmp/tmp_file