删除超过 X 天的文件 +

Ted*_*291 185 find timestamps rm files

我找到了删除文件夹中超过 5 天的文件的命令

find /path/to/files* -mtime +5 -exec rm {} \;
Run Code Online (Sandbox Code Playgroud)

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

bas*_*ic6 335

管道传输到 rm 时,请注意特殊文件名(空格、引号)。

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

find /path/to/directory/ -mindepth 1 -mtime +5 -delete
Run Code Online (Sandbox Code Playgroud)

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

更换-delete-depth -print你运行它(之前测试这个命令-delete意味着-depth)。

  • 也可以使用 `-type f` 只删除文件(并保留子目录) (32认同)
  • 请注意,每个 find 参数都是一个过滤器,它使用前一个过滤器的结果作为输入。因此,请确保将 -delete 添加为最后一个参数。IE:`找到。-delete -mtime +5` 将删除当前路径中的所有内容。 (18认同)
  • 或者,如果您想对所有比五天新的文件执行相同的操作: find /path/to/directory/ -mindepth 1 -mtime -5 -delete (4认同)
  • @uom-pgregorio 我建议将路径放在引号中。 (3认同)
  • 使用选项 `-mmin` 代替 `-mtime`,您可以以分钟为单位指定时间。 (3认同)

Jul*_*ius 19

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

bash: /usr/bin/find: Argument list too long
Run Code Online (Sandbox Code Playgroud)

这意味着超出了 exec 系统调用对命令行长度的限制。与以这种方式执行 rm 不同,使用xargs效率更高。这是一个有效的例子:

find /root/Maildir/ -mindepth 1 -type f -mtime +14 | xargs rm
Run Code Online (Sandbox Code Playgroud)

这将在 /root/Maildir/ 下递归删除所有修改时间超过 14 天的文件(类型 f),并且更深(mindepth 1)。有关更多选项,请参阅查找手册

  • 根据@AfshinHamedi 在 AskUbuntu (https://askubuntu.com/questions/589210/removing-files-older-than-7-day) 上的回答,小心包含换行符和特殊字符的文件。而是使用`find /root/Maildir/ -mindepth 1 -type f -mtime +14 -print0 | xargs -r0 rm --` (8认同)
  • 或者只是在查找结果中添加“+” (2认同)

apa*_*aul 10

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

find /path/to -type f -mtime +5 -exec rm {} \;
Run Code Online (Sandbox Code Playgroud)

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

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

  • 请注意,对于每个文件,您都将执行 rm 命令。如果您有 1000 个早于 5 天的文件,那么 rm 将启动 1000 次。出于这个原因考虑 -delete 选项,如 Costa 的评论或 -exec rm {} \+ (4认同)