![Bash 脚本用于删除超过 x 天的文件及其子目录](https://linux22.com/image/1300651/Bash%20%E8%84%9A%E6%9C%AC%E7%94%A8%E4%BA%8E%E5%88%A0%E9%99%A4%E8%B6%85%E8%BF%87%20x%20%E5%A4%A9%E7%9A%84%E6%96%87%E4%BB%B6%E5%8F%8A%E5%85%B6%E5%AD%90%E7%9B%AE%E5%BD%95.png)
我正在尝试删除大量超过 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
如果您需要更快find
地rm
处理大量文件,请查看find ... | xargs ... rm
UNIX 习语。
答案3
您可以使用 find 命令轻松完成此操作
$ find -type f
这将结果限制为文件类型
答案4
'+'
为了加快命令速度,请使用\;
find /path/to/files* -type f -mtime +10 -exec rm '{}' '+'
这将rm
在最后运行一次,而不是每次找到文件时都运行。
(rm
如果您有大量文件,可能会运行几次,因为命令行长度限制,但这仍然几乎与使用一样快-delete
)