如何删除 X 年内未使用(访问、更改或修改)的任何文件

如何删除 X 年内未使用(访问、更改或修改)的任何文件

我运行这个命令

find BAR -type f -mtime +1095 # older than 3 years

并找到这个文件:

BAR/foo.pdf

所以我运行这个:

stat BAR/foo.pdf
Access: 2020-01-03 01:32:05.584393000 -0500
Modification: 2017-12-04 07: 59: 36.963225900 -0500
Change: 2020-01-02 10: 26: 28.907127100 -0500
# or
find BAR/foo.pdf -type f -printf "%p\n%a\n%c\n\n"
Fri Jan  3 01:32:05.5843930000 2020
Thu Jan  2 10:26:28.9071271000 2020

“访问”和“更改”日期未满 3 年

如果运行

find BAR -type f -ctime +1095 # older than 3 years

一无所获

我想要删除 3 年内未使用(访问、更改或修改)的任何文件

PD:在示例中,仅满足 2 个条件。我希望我的命令能够搜索满足 3 个条件的文件:3 年以上未访问、修改或更改的文件

答案1

find-a使用隐式(AND 运算符)组合测试。在您的命令中:

find BAR -type f -ctime +1095

已经有两个测试:-type f-mtime +1095。命令可以写成:

find BAR -type f -a -ctime +1095

您可以直接添加更多测试。例如:

find BAR -type f -ctime +1095 -mtime +1095 -atime +1095
# or with explicit -a
find BAR -type f -a -ctime +1095 -a -mtime +1095 -a -atime +1095

如果文件匹配,上述两个命令都会打印文件的路径名全部四个测试(-type f-ctime +1095-mtime +1095-atime +1095)。这似乎是你想要的(但请注意,如果find BAR -type f -ctime +1095没有结果,那么添加更多必须匹配的测试也不会有任何结果;这只是因为没有常规文件BAR符合您的条件,一般来说该命令可能会找到一些东西)。

对于(隐式或显式)-a,如果之前的测试失败,则不会执行-a之后的测试(因为它们无法改变结果)。 的一些实现会改变测试的顺序以提高性能,尽量不破坏逻辑。-afind

还有-o(或运算符)。它的用法有时不直观,因为-a优先(比较我的这个答案)。还有!否定测试。通常,您可以组合多个测试来构建您想要的任何逻辑(请参阅“理论”部分这是我的另一个答案)。

要实际删除您需要的文件-delete-exec rm {} +(请参阅这个问题了解差异)。

答案2

引自这个答案

有三种“时间戳”:

  • Access - 上次读取文件的时间
  • 修改——文件最后修改时间(内容已被修改)
  • 更改 - 上次更改文件元数据的时间(例如权限)

find 的手册页显示:

   -ctime n
          File's status was last changed less than, more than or
          exactly n*24 hours ago.  See the comments for -atime to
          understand how rounding affects the interpretation of file
          status change times.

   -mtime n
          File's data was last modified less than, more than or
          exactly n*24 hours ago.  See the comments for -atime to
          understand how rounding affects the interpretation of file
          modification times.

所以mtime对应的是Modify,而ctime对应的是Change。

根据统计数据,结果是正确的:

Modification: 2017-12-04 07: 59: 36.963225900 -0500
Change: 2020-01-02 10: 26: 28.907127100 -0500

对于访问时间,您应该使用atime

相关内容