![如何删除上次修改于一个月或一个月以上的文件](https://linux22.com/image/1019767/%E5%A6%82%E4%BD%95%E5%88%A0%E9%99%A4%E4%B8%8A%E6%AC%A1%E4%BF%AE%E6%94%B9%E4%BA%8E%E4%B8%80%E4%B8%AA%E6%9C%88%E6%88%96%E4%B8%80%E4%B8%AA%E6%9C%88%E4%BB%A5%E4%B8%8A%E7%9A%84%E6%96%87%E4%BB%B6.png)
我找到了这样的解决方案:
find . -type f ! -newermt '04/29/2018 16:00:00' -exec rm -f {} \;
但我需要动态日期。我的意思不是某个固定日期,而是我每天都会将此脚本与 cron 一起使用,它应该会删除一个月前(甚至更久)更改的所有文件。
谢谢!
答案1
根据man find
,您可以使用命令识别的字符串date
。
-newerXY 参考 如果正在考虑的文件的时间戳 X 为 比文件引用的时间戳 Y 更新。字母 X 并且 Y 可以是以下任意字母: a 文件引用的访问时间 B 文件引用的诞生时间 c inode状态改变时间参考 m 文件引用的修改时间 t 引用直接解释为时间 有些组合是无效的;例如, 为 X 为 t。有些组合未在 所有系统;例如 B 并非所有系统都支持。 如果 XY 组合无效或不受支持 指定,将导致致命错误。 时间规范 被解释为 GNU 的 -d 选项的参数 日期。 如果你尝试使用参考文件的出生时间, 并且无法确定出生时间,这是一个致命的错误 消息结果。如果您指定引用 正在检查的文件的出生时间,此测试将失败 对于任何出生时间不明的文件。
根据man date
,您可以使用人类可读的短语,例如“一个月前”。更多详细信息请参见 GNU Coreutils 手册:日期输入格式。
日期字符串 --date=STRING 是大部分是自由格式的人类可读日期 细绳 例如“2004 年 2 月 29 日星期日 16:21:42 -0800”或 “2004-02-29 16:21:42” 或甚至“下周四”. 日期字符串 可能包含指示日历日期、一天中的时间、时间的项目 区域、星期几、相对时间、相对日期和数字。 空字符串表示一天的开始。日期 字符串格式比这里记录的要复杂得多,但是 在信息文档中有完整的描述。
作为bac0n 笔记,你可能对find
的-delete
旗帜感兴趣:
-删除 删除文件;如果删除成功则返回 true。如果 删除失败,则发出错误消息。如果 -delete 失败时,find 的退出状态将为非零(当它 最终退出)。使用 -delete 会自动关闭 关于‘-depth’选项。 警告:不要忘记 find 命令行是 将其作为表达式进行计算,因此将 -delete 放在第一位将 尝试删除起始位置以下的所有内容 指定点。测试 find 命令行时 你以后打算使用 -delete,你应该 明确指定-depth,以避免以后 惊喜。因为-delete 意味着-depth,所以你不能 有用地一起使用 -prune 和 -delete。 与 -ignore_readdir_race 选项一起,查找 将忽略 -delete 操作的错误,在这种情况下 由于读取父目录,文件已经消失: 它不会输出错误诊断,并且返回 -delete 操作的代码将为真。
因此您需要的命令可能类似于:
find -type f \! -newermt "last month" -delete
答案2
您可以使用
find . -type f -mtime +30 -exec rm -f {} \;
或更简单
find . -type f -mtime +30 -delete
这将删除 30 天前修改的所有文件。
答案3
我的解决方案:
find . -type f ! -newermt "$(date -d 'now - 1 month' +'%D %T')" -exec rm -f {} \;
答案4
其中一种方法是:
find /path -type f ! -newermt "1 month ago" -delete
其他格式如“10 分钟前”也可以。