正常删除超过 30 天的文件

正常删除超过 30 天的文件

我有一个至少有 15000 个文件的缓存文件夹。

我尝试了这个:

find cache* -mtime +30 -exec rm {} \;

但这让我的服务器负载飞涨!

有没有更快/更好解决方案?

或者我可以限制速度或迭代次数这个命令?

答案1

我喜欢用tmpwatch对于这些内容,这是最后一次修改文件。它很简单,在很多情况下都很有效:

tmpwatch -m 720 /path/to/cache

对于 Ubuntu,请检查tmpreaper反而。

如果您想检查上次访问文件的时间,请使用以下命令:

tmpwatch -a 720 /path/to/cache

您无法在使用 noatime 安装的文件系统上使用 tmpwatch -a。您仍然可以使用 -m

答案2

您可以使用以下方法避免为每个文件生成一个新进程

find cache* -mtime +30 -delete

答案3

尝试使用 nice 运行上述操作:

nice -n 39 find cache* -mtime +30 -exec rm -f {} ';'

这样,只有在没有其他需要运行时才会出现巨大的负载,否则其他进程将优先(如果它们的优度低于 19,即最大值)。

请注意,-n 选项的参数被添加到默认的优先级中,该优先级在 -20 到 19 之间变化。我使用了 39,这样它非常不管原有的美好如何,都是美好的。

答案4

正如 chiborg 所评论的,加载是由于对找到的每个文件启动 rm。我注意到答案tmpwatch建议作为一种替代方案,我相信这种方法效果很好。然而,这不是必要的。

如果您告诉 Find 将找到的文件累积到参数列表中,则它可以运行一次传递给 exec 的命令,如下所示:

find /path -name "*.moo" -exec rm {} \+

有时,这可能会失败,因为参数列表可能会变得比 shell (getconf ARG_MAX) 允许的最大值(以字节为单位)更大。这可以通过 xargs 的 -L 选项来解决。

考虑这个例子:

$ echo 0 > /tmp/it; 
$ for i in {0..15000};do echo $i;done  |\
    xargs --no-run-if-empty -L 5000 ./tmp/xr.sh 
Iteration=0; running with 5000 arguments
Iteration=1; running with 5000 arguments
Iteration=2; running with 5000 arguments
Iteration=3; running with 1 arguments

$ cat tmp/xr.sh 
#!/bin/sh
IT=`cat /tmp/it`
echo Iteration=$IT\; running with $# arguments
let IT=IT+1
echo $IT > /tmp/it

因此不需要安装额外的软件,您所需要的只是 gnu-findutils:

find /path -mtime +30 -print0 | xargs -0 -L 5000 rm 

相关内容