如何在 find -exec 中使用 tar‘--remove-files’选项?

如何在 find -exec 中使用 tar‘--remove-files’选项?

我有许多非常大的日志文件需要压缩单独地所以我不能使用 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

相关内容