如何删除上次修改于一个月或一个月以上的文件

如何删除上次修改于一个月或一个月以上的文件

我找到了这样的解决方案:

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 分钟前”也可以。

相关内容