我试图在 NAS 上查找一些文件,然后删除超过 5 天的文件/文件夹。我可以使用 find 命令:
find /volume1/docker/UV/videos -type f -print
然后我从视频文件夹和子目录中获取所有文件。
但如果我尝试:
find /volume1/docker/UV/videos -mtime +2 -print
然后什么也没有发生,我知道有超过 2 天的文件,然后如果我将 2 更改为 1,也会发生同样的情况。
因此,我无法获取文件和子目录的列表,这些文件和子目录的列表中存在超过 2 天的文件。我想要的是找到文件/文件夹,然后将 -print 更改为 -delete,但我正在使用 -print,所以我知道结果会是什么,但是 atm.结果什么都没有。
有人可以帮助/指导我吗?
答案1
问题在于-atime
,-ctime
和-mtime
选项会进行一些意外的舍入。解释是在man find
在下面-atime
:
-atime n
文件最后被访问n *24小时前。什么时候
find
计算出上次访问文件是在多少个 24 小时周期之前,忽略任何小数部分,以便匹配-atime +1
,文件必须至少被访问过二几天前。
现代版本中有替代方案find
:
-mmin
(和变体)四舍五入到分钟,而不是到天。因此,-mmin "+$(( 60*24*2 ))"
根据 2 天前的当前时间进行工作。
-daystart
根据当天的 00:00:00 来测量时间。这是一个相当不准确的工具,并且对命令行上选项的顺序很敏感。
如果您使用的系统没有这些最新的扩展find
(例如,Solaris 或 AIX),或者不希望所有内务工作都有强制的午夜截止时间,并且不希望每次执行时都有不同的截止时间,请使用参考文件是一个不错的选择。
Paul--) touch -t 202009020301 FileToRetain
Paul--) touch -t 202009020300 FileOnCusp
Paul--) touch -t 202009020259 FileToDelete
Paul--)
Paul--) touch /tmp/myRefFile -t $( date -d '4 days ago' '+%Y%m%d0300' )
Paul--) ls -ltr /tmp/myRefFile .
-rw-r--r-- 1 paul paul 0 Sep 2 03:00 /tmp/myRefFile
.:
total 0
-rw-r--r-- 1 paul paul 0 Sep 2 02:59 FileToDelete
-rw-r--r-- 1 paul paul 0 Sep 2 03:00 FileOnCusp
-rw-r--r-- 1 paul paul 0 Sep 2 03:01 FileToRetain
Paul--) find . -type f ! -newer /tmp/myRefFile -delete
Paul--) ls -ltr /tmp/myRefFile .
-rw-r--r-- 1 paul paul 0 Sep 2 03:00 /tmp/myRefFile
.:
total 0
-rw-r--r-- 1 paul paul 0 Sep 2 03:01 FileToRetain
Paul--)
参考文件不应位于正在清理的目录中(它可能会在某个有趣的时刻删除自身),并且在生产中您可能应该使用mktemp
PID 或将 PID 作为名称的一部分,以避免并发使用出现问题,rm
然后再使用。
当然,如果您没有 现代find
,那么您可能也没有date -d
。我的内务管理是按月进行的,因此在 Solaris 上,必须编写月/年溢出脚本,而不是月末或闰年 - 只需设置 dd=01 即可。但是,与一周或一个月中的特定日期对齐find
本身是无法干净地完成的另一件事:date -d 'last Sunday 06:00'
作为参考文件很有帮助。
答案2
find path -type f -daystart -mtime +5 -exec rm -rvf {} \;