我运行这个命令
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
之后的测试(因为它们无法改变结果)。 的一些实现会改变测试的顺序以提高性能,尽量不破坏逻辑。-a
find
还有-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
。