删除超过X天的文件+


143

我找到了删除文件夹中5天以上文件的命令

find /path/to/files* -mtime +5 -exec rm {} \;

但是,我还要如何对该文件夹中的子目录执行此操作?


您是指子目录中的文件吗?或子目录本身?
rahul 2015年

3
find /path/to -type d -empty -delete
Costas 2015年

2
删除也存在5天以上的子目录中的文件
Teddy291

3
当我的文件带有空格时,可能会很有趣。例如,一个名为“ test one”的文件,rm被送入rm test one。(将删除名为“ test”的文件和名为“ one”的文件,但不会删除名为“ test one”的文件)。提示:-delete或-print0
Hennes

6
附带说明一下,请务必引用提供的参数find以避免出现特殊字符,如答案的第一行中所述。例如:find /path/to/files/ -exec somecommand '{}' \;
Walf

Answers:


240

传递给rm时,请注意特殊文件名(空格,引号)。

有一个安全的替代方法--delete选项:

find /path/to/directory/ -mindepth 1 -mtime +5 -delete

就是这样,没有单独的rm调用,您不必担心文件名。

替换为-delete-depth -print以在运行此命令之前对其进行测试(-delete暗含-depth)。


23
还用于-type f仅删除文件(并保留子目录)
Oleg

3
另外,如果要对所有文件进行更新,但要晚于五天:查找/ path / to / directory / -mindepth 1 -mtime -5 -delete
zmonteca

如果我的路径包含空格,该怎么办?find /path/to/dir\ with\ spaces/ -mindepth 1 -mtime +5 -delete
帕特里克·格雷戈里奥

3
@ uom-pgregorio我建议将路径用引号引起来。
atripes

4
请注意,每个find参数都是一个使用前一个过滤器的结果作为输入的过滤器。因此,请确保将-delete添加为最后一个参数。IE:find . -delete -mtime +5将删除当前路径中的所有内容。
约翰

15

请注意,该命令在找到太多文件时将不起作用。它将产生如下错误:

bash: /usr/bin/find: Argument list too long

表示超出了exec系统调用对命令行长度的限制。与以这种方式执行rm相比,使用xargs效率更高。这是一个有效的示例:

find /root/Maildir/ -mindepth 1 -type f -mtime +14 | xargs rm

这将从/ root / Maildir /下递归删除所有超过14天之前修改过的文件(类型f),并且从那里更深(最小深度1)。有关更多选项,请参见查找手册


7
根据@AfshinHamedi在AskUbuntu上的回答(askubuntu.com/questions/589210/removing-files-older-than-7-day),请小心包含换行符和特殊字符的文件。find /root/Maildir/ -mindepth 1 -type f -mtime +14 -print0 | xargs -r0 rm --
改为

2
或仅在查找结果中添加“ +”
Dani_l

8

一样的。您只需要提供父目录而不是文件前缀即可。在您的示例中,它将是:

find /path/to -type f -mtime +5 -exec rm {} \;

这将删除5天以下的所有文件/path/to及其子目录。

要删除空的子目录,请参阅上面的@Costas注释。


4
请注意,对于每个文件,您将执行rm命令。如果您有1000个文件早于5天,则rm将启动1000次。因此,请像Costa的注释中那样考虑-delete选项,或者考虑-exec rm {} \ +
Hennes

@Hennes:-1)不确定+在这种情况下是否需要逃脱。-2)最好写-exec rm '{}' +一些名称带有特殊字符(空格,换行符等)的文件,以防有害。
Cbhihe

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.