正常删除30天以上的文件


8

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

我尝试了这个:

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

但是,这使我的服务器负载飞涨了!

有什么更快/更好的解决方案?

还是可以限制此命令的速度或迭代次数


1
如果cache*扩展到许多文件,则可能需要尝试类似的操作find . -name 'cache*' -mtime +30 -exec rm {} \;
Jaap Eldering,2012年

Answers:


10

我喜欢用tmpwatch这些东西,这是文件的最后修改。它很简单,并且在许多情况下都可以很好地工作:

tmpwatch -m 720 /path/to/cache

对于Ubuntu,请检查tmpreaper

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

tmpwatch -a 720 /path/to/cache

您不能在使用noatime挂载的文件系统上使用tmpwatch -a。您仍然可以使用-m


我使用的是Ubuntu 10.04.2 LTS和该命令不存在..
克里斯蒂安

2
@Kristian检查tmpreaper代替。
slhck

使用这些来管理通过noatime选项挂载的文件系统时有什么陷阱?
AnonymousLurker

@AnonymousLurker我为您
修改

6

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

find cache* -mtime +30 -delete

3

尝试使用nice运行以上代码:

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

这样,只有在没有其他需要运行的情况下才会出现巨大的负载,否则其他进程将具有优先权(如果它们的友好度小于19,即最大)。

注意参数的-n选项被添加到其变化我用39 -20和19之间,这将是默认的正派非常不错,无论是什么原正派有。


2

正如chiborg所说,负载是由于找到的每个文件启动rm引起的。我注意到在哪里tmpwatch建议将答案作为替代方法,我确信它可以很好地工作。但是,这不是必需的。

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

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

有时这可能无法正常工作,因为参数列表的增长(以字节为单位)可能大于外壳程序所允许的最大值(getconf ARG_MAX)。这可以通过带有-L选项的xargs解决。

考虑以下示例:

$ 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 

一些d00d认为添加-print0和-0来查找和xargs很有用。这些参数强制其命令使用空字符(\ 0)而不是换行符(\ n)分隔参数。当文件名中包含空格或换行符时,这很有用。
ЯрославРахматуллин

(1)你不必说\+;普通+就足够了。(2)这不会“因为参数列表可能会变大而无法工作……”。  find  … -exec … {} +将做与将要做的相同的事情xargs;它会根据需要多次运行命令。例如(如您的示例),如果您的文件在15001至20000之间,find则将运行-exec'd程序(rm)四次。
G-Man说'Reinstate Monica''Apr
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.