如何删除一个月前最后一次修改的所有文件

Sar*_*yev 2 bash

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

find . -type f ! -newermt '04/29/2018 16:00:00' -exec rm -f {} \;
Run Code Online (Sandbox Code Playgroud)

但我需要动态日期。我的意思不是一个固定的日期,但我将每天在 cron 中使用这个脚本,它应该删除所有文件,在一个月前(以及更多)更改。

谢谢!

xio*_*ota 6

根据man find,您可以使用date命令识别的字符串。

-较新的XY参考

       如果正在考虑的文件的时间戳 X 是成功的 
       比文件引用的时间戳 Y 新。字母 X
       并且 Y 可以是以下任何字母:

       a 文件引用的访问时间
       B 文件引用的诞生时间
       c 引用的inode状态变化时间
       m 文件引用的修改时间
       t 引用被直接解释为时间

       某些组合无效;例如,它是无效的
       X 为 t。某些组合未实现
       所有系统;例如,并非所有系统都支持 B。  
       如果无效或不受支持的 XY 组合是 
       指定,会导致致命错误。   时间规格
       被解释为 GNU 的 -d 选项的参数 
       日期。  如果您尝试使用参考文件的出生时间,
       并且无法确定出生时间,致命错误 
       消息结果。如果您指定一个测试,它指的是
       正在检查的文件的出生时间,此测试将失败 
       对于任何出生时间未知的文件。

根据man date,您可以使用人类可读的短语,例如“一个月前”。有关更多详细信息,请参阅 GNU Coreutils 手册:日期输入格式

日期字符串
       --date=STRING 是一个 大多数自由格式的人类可读日期
       细绳  例如“Sun, 29 Feb 2004 16:21:42 -0800”或  
       “2004-02-29 16:21:42”甚至“下周四”。一个日期字符串
       可能包含指示日历日期、时间、时间的项目 
       区域、星期几、相对时间、相对日期和数字。   
       空字符串表示一天的开始。日期
       字符串格式比这里容易记录的要复杂,但是 
       在信息文档中有完整的描述。

正如bac0n 所指出的,您可能对find-delete标志感兴趣:

-删除
       删除文件; 如果删除成功,则为 true。如果
       删除失败,会发出错误消息。如果-删除
       失败,find 的退出状态将是非零的(当它  
       最终退出)。使用 -delete 自动转
       在`-depth'选项上。

       警告:不要忘记 find 命令行是 
       评估为表达式,因此首先将 -delete 
       make find 尝试删除起始位置下方的所有内容 
       您指定的点。测试 find 命令行时
       您以后打算与 -delete 一起使用,您应该 
       明确指定 -depth 以避免以后 
       惊喜。因为 -delete 意味着 -depth,你不能
       一起使用 -prune 和 -delete 很有用。

       与 -ignore_readdir_race 选项一起,找到 
       在这种情况下将忽略 -delete 操作的错误 
       读取父目录后文件已消失: 
       它不会输出错误诊断,并且返回 
       -delete 操作的代码将为真。

因此,您需要的命令可能类似于:

find -type f \! -newermt "last month" -delete
Run Code Online (Sandbox Code Playgroud)