【问题标题】:find files older than X days in bash and delete在 bash 中查找超过 X 天的文件并删除
【发布时间】: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 分钟的文件,稍后您的另一个查找会找到这些文件。
  • 刚刚想通了!原因是lsfind 找到一个 mtime +13 的目录,ls 简单地列出它的所有内容,无论文件有什么 mtime(facepalm!)。
  • 您可以使用选项-d 代替ls 仅显示目录名称而不是其所有内容。
  • 始终先测试您的查找命令,将“-delete”替换为“-print”。它还可能在结果列表中包含当前目录 (.),这可能是也可能不是您想要的。

标签: bash find


【解决方案1】:
find your/folder -type f -mtime +13 -exec rm {} \;

【讨论】:

  • 不适用于包含空格的文件名。 (GNU 特定)find -deletefind -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 开关没用。此外,如果您的文件名包含空格或其他有趣的符号,您会遇到问题。如果您的实用程序支持它们,请使用-print0xargs -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

这避免了文件名中的空格和诸如此类的任何可能的问题,并且它不会启动另一个可执行文件来执行删除,因此它也应该更快。

我对此进行了尝试和测试。

【讨论】:

    猜你喜欢
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    相关资源
    最近更新 更多