压缩早于X时间的文件并删除旧文件的语句

3

我尝试编写一个 bash 脚本,用于压缩早于 X 天的文件,并在压缩后删除未压缩的版本。我尝试了以下代码,但它无法正常工作。

find /home/randomcat -mtime +11 -exec gzip {}\ | -exec rm;

请在在这里提问之前阅读命令文档。请尝试在您的计算机上输入 man findman gzip 来获取帮助。 - Basile Starynkevitch
你的命令中 | 符号有误。 - Basile Starynkevitch
3个回答

8
默认情况下,gzip 将删除未压缩的文件(因为它用压缩的变体替换了它)。而且你不希望它在除纯文件(不在目录或设备上,也不在符号链接上)以外的任何内容上运行。

所以你至少需要:

 find /home/randomcat -mtime +11 -type f -exec gzip {} \;

您甚至可能希望find(1)避免具有多个硬链接的文件。您可能还希望在运行命令之前询问它。那么,您可以尝试:

find /home/randomcat -mtime +11 -type f -links 1 -ok gzip {} \;

find命令配合-exec-ok使用需要分号(或加号),您需要从shellescape分号;。您可以使用';'代替\;quote它...

如果使用+find命令将把多个参数(传递给单个gzip进程)分组,因此运行的进程较少(但它们会持续更长时间)。因此,您可以尝试使用:

 find /home/randomcat -mtime +11 -type f -links 1 -exec gzip -v {} +

你可能想了解更多关于globbing和shell 工作原理的内容。
顺便说一下,你不需要任何命令管道(如你问题中错误使用的|所建议的那样)。
你甚至可以考虑使用GNU parallel来并行运行任务,或将某些shell(带有后台作业)馈送给例如。
find /home/randomcat -mtime +11 -type f -links 1 \
  -exec printf "gzip %s &\n" {} \; | bash -x

但实际上,您不会大幅加快处理速度。


我已经检查过了,文件已经被压缩了,但未压缩的版本仍然存在...也许我应该添加类似于 | -exec rm; 的东西? - harcotlupus
你确定吗?我在尝试我建议的命令时没有观察到这种行为。你是否按需要转义了分号? - Basile Starynkevitch
1
你应该从命令中删除 |。这是错误的。请注意,我的建议中没有使用任何 | - Basile Starynkevitch

2
find /home/randomcat -mtime +11 -exec gzip {} +

这个bash脚本压缩了使用"find命令"找到的文件。它不会生成新的gzip格式文件,而是将文件转换为gzip格式。假设你有三个文件,它们的名称是a、b、c,并且比X旧。
运行find /home/randomcat -mtime +11 -exec gzip {} +命令后,在/home/randomcat目录中,你将看到a.gz、b.gz、c.gz,而不是a、b、c。

我不确定这个。find需要一个分号,并且应该进行转义以避免被shell处理。 - Basile Starynkevitch
你是对的,那是一个错误。应该使用"find /home/randomcat -mtime +11 -exec gzip {};"或者"find /home/randomcat -mtime +11 -exec gzip {} +"。 - dburcu
那么您需要编辑您的答案(或删除它)。我不理解第一行和其中的反斜杠。 - Basile Starynkevitch
为什么第一行要用双引号? - Basile Starynkevitch
“find”命令末尾使用“+”和“;”有什么区别? - Colin 't Hart
关于find ... +find ... \;之间的区别的好回答:https://askubuntu.com/a/558819/329317 - AntonioK

0
find /location/location -type f -ctime +15 -exec mv {} /location/backup_location \;

这将帮助您找到所有文件并移动到备份文件夹


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接