Bash 脚本用于删除超过 x 天的文件及其子目录

Bash 脚本用于删除超过 x 天的文件及其子目录

我正在尝试删除大量超过 x 天的文件。

现在我有一个脚本可以做到这一点

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

但这也会删除子目录。有很多文件夹,但我想保留它们,并删除所述文件夹中超过 10 天的文件。

有没有办法做到这一点?

答案1

type过滤结果的选项

find接受type选择的选项,例如仅选择文件。

find /path/to/files -type f -mtime +10 -delete

省略显示-delete要删除的内容,一旦您验证了这一点,就继续运行完整的命令。

这只会对文件运行,而不会对目录运行。-type d反过来用,只列出符合你参数的目录。


其他选项

您可能想要阅读man find,因为未来您可能需要更多选项。例如,-maxdepth允许您仅将找到的项目限制在特定深度,例如-maxdepth 0不会递归到子目录中。

一些评论

  • 我想知道该命令如何删除文件夹,因为您不能rm仅使用 来删除文件夹。您需rm -r要这样做。

  • 此外,/path/to/files*这很令人困惑。您的意思是/path/to/files/还是希望通配符扩展为多个文件和文件夹名称?

  • 将其放在{}单引号中,即'{}'避免替换的文件/目录名被 shell 解释,就像我们用反斜杠保护分号一样。

答案2

与之前的答案一样(两者均为+1),诀窍是使用-type f谓词。

-exec rm '{}'请注意,您也可以使用谓词来代替-delete。但不要这样做。-exec rm '{}'您可以(也应该)先使用-exec echo rm '{}'来验证这确实是您想要的。之后,重新运行不带 的命令echo

使用-delete速度更快(每个文件无需额外fork()付费execve()),但这是有风险的,因为-delete也可以作为条件,因此:

# delete *.tmp files
find . -type f -name '*.tmp' -delete

但如果你只交换参数:

# delete ALL files
find . -type f -name '*.tmp' -delete

如果您需要更快findrm处理大量文件,请查看find ... | xargs ... rmUNIX 习语。

答案3

您可以使用 find 命令轻松完成此操作

$ find -type f

这将结果限制为文件类型

答案4

'+'为了加快命令速度,请使用\;

find /path/to/files* -type f -mtime +10 -exec rm '{}' '+'

这将rm在最后运行一次,而不是每次找到文件时都运行。
rm如果您有大量文件,可能会运行几次,因为命令行长度限制,但这仍然几乎与使用一样快-delete

相关内容