当“参数列表太长”时如何删除所有早于3天的文件?

89

我有一个包含82000个文件和目录的日志文件目录(大约一半是文件,一半是目录)。

我需要删除所有3天前的文件和目录。

在一个包含37000个文件的目录中,我能够使用以下命令来实现:

find * -mtime +3 -exec rm {} \;

但是当我有82000个文件/目录时,我会收到以下错误:

/usr/bin/find: Argument list too long

我该如何解决这个错误,以便我可以删除所有3天前的文件/目录?


1
你尝试过 find -mtime +3 -exec rm {} + 吗? - Gilles Quénot
1
我相信运行 find * -mtime +3 |xargs rm 可以解决那个问题。 - Mats Petersson
10
我认为唯一的问题是 find *,使用 find . 会更好。因为 shell 通配符 * 会扩展成大量的文件和目录,导致问题。 - artless noise
@artlessnoise 是正确的。 - sjas
3个回答

123

要删除当前目录中的所有文件和目录

find . -mtime +3 | xargs rm -Rf

或者,更符合原贴作者的命令:

find . -mtime +3 -exec rm -Rf -- {} \;

27
问题出在 "find *" 中的星号上,你用 "find ." 来解决了这个问题。Xargs 在这里有误导作用。 - Aleksandr Levchuk
7
它解决了OP的问题,因此不应该被点踩。 - hd1
11
回答:使用“find . -mtime +3 -exec rm {} ;”代替“find * -mtime +3 -exec rm {} ;”,因为前者可以避免出现参数列表过长的错误。 - Aleksandr Levchuk
2
你可能想在rm后面添加--,像这样:find . -mtime +3 -exec rm -- {} \; - domen
8
没有人说明--是什么意思。 - Asclepius
显示剩余7条评论

61

也可以使用:

find . -mindepth 1 -mtime +3 -delete

不要删除目标目录


4
最佳答案,比调用 rm 命令更加简洁(而且可能更安全)。也适用于子目录。 - basic6

17

对于原问题的另一个解决方案,特别适用于您只想从文件夹中删除一些旧文件的情况,可以采用以下方法:

find . -name "*.sess" -mtime +100 

等等等等.. 引号块中的 shell 通配符,因此允许您 "查找" 数百万个文件 :)


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