在 bash 中查找超过 X 天的文件并删除
Posted
技术标签:
【中文标题】在 bash 中查找超过 X 天的文件并删除【英文标题】:find files older than X days in bash and delete 【发布时间】:2013-12-12 20:12:21 【问题描述】:我有一个包含几 TB 文件的目录。我想删除其中所有超过 14 天的文件。
我想我会使用find . -mtime +13 -delete
。为了确保命令按预期工作,我运行了find . -mtime +13 -exec /bin/ls -lh '' \; | grep '<today>'
。后者应该什么都不返回,因为find
使用-mtime +13
不应该找到今天创建/修改的文件。然而,令我惊讶的是,find
刚刚吐出了今天修改/创建的所有文件的列表!
【问题讨论】:
您确定您或其他人没有修改这些文件吗?! 查看-daystart
查找选项。您的查找正好倒数 24*13 小时,留下可能是 24*13 - 1 分钟的文件,稍后您的另一个查找会找到这些文件。
刚刚想通了!原因是ls
。 find
找到一个 mtime +13 的目录,ls
简单地列出它的所有内容,无论文件有什么 mtime(facepalm!)。
您可以使用选项-d
代替ls
仅显示目录名称而不是其所有内容。
始终先测试您的查找命令,将“-delete”替换为“-print”。它还可能在结果列表中包含当前目录 (.),这可能是也可能不是您想要的。
【参考方案1】:
find your/folder -type f -mtime +13 -exec rm \;
【讨论】:
不适用于包含空格的文件名。 (GNU 特定)find -delete
或 find -print0 | xargs -0 rm
@grebneke:你能用例子或事实来支持你的陈述吗? find
的
在文件名中的空格和有趣符号方面众所周知是安全的。
这确实适用于我 redhat linux/bash 的带有空格的文件名。
只需将 括在引号中:find your/folder -type f -mtime +13 -exec rm "" \;
不需要额外的xargs
命令,只需使用find your/folder -type f -mtime +13 -delete
【参考方案2】:
这对我有用。
$ find ./folder_name/* -type f -mtime +13 -print | xargs rm -rf
【讨论】:
-r
开关没用。此外,如果您的文件名包含空格或其他有趣的符号,您会遇到问题。如果您的实用程序支持它们,请使用-print0
和xargs -0 ...
,否则使用@Mindx 的答案。或者,如果您的find
支持它,请使用find
的-delete
测试:find ./folder_name -type f -mtime +13 -delete
。
虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。【参考方案3】:
最简单的解决方案是在@navid 和@gniourf_gniourf 的cmets 中。因为它被埋在 cmets 中,所以我想把它提高到更明显的地方。
find your/folder -type f -mtime +13 -delete
这避免了文件名中的空格和诸如此类的任何可能的问题,并且它不会启动另一个可执行文件来执行删除,因此它也应该更快。
我对此进行了尝试和测试。
【讨论】:
以上是关于在 bash 中查找超过 X 天的文件并删除的主要内容,如果未能解决你的问题,请参考以下文章
Linux使用find查找最后修改时间超过三天的文件并移动到指定目录
bash脚本通过每天保留1个备份来删除超过7天的备份[重复]