我正在尝试删除大量超过 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 解释,就像我们用反斜杠保护分号一样。
与之前的答案一样(两者都为+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)
如果您需要find并rm更快地处理大量文件,请查看find ... | xargs ... rmUNIX 惯用法。