使用 Bash 脚本删除超过 x 天的带有子目录的文件

Joy*_*dez 37 linux find

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

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

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

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

有没有办法做到这一点?

slh*_*hck 50

type 过滤结果选项

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

find /path/to/files -type f -mtime +10 -delete
Run Code Online (Sandbox Code Playgroud)

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

那只会在文件上运行,而不是目录。使用-type d了逆,只列出符合您的论点,即目录。


其他选项

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

一些备注

  • 我想知道该命令如何删除文件夹,因为您不能rm仅删除文件夹。你需要rm -r那个。

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

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

  • @JoyIanYee-Hernandez 您还可以将 `-delete` 参数用于 `find`,它会删除所有文件和文件夹,后者仅在为空时。它意味着`-depth`,即深度优先搜索。 (2认同)

Mic*_*jer 5

与之前的答案一样(两者都为+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
Run Code Online (Sandbox Code Playgroud)

但如果你只交换参数:

# delete ALL files
find . -type f -name '*.tmp' -delete
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为您的最后两个示例完全相同,可能需要更正! (4认同)