在linux中查找命令并删除,但用print测试,没有给出结果

在linux中查找命令并删除,但用print测试,没有给出结果

我试图在 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--) 

参考文件不应位于正在清理的目录中(它可能会在某个有趣的时刻删除自身),并且在生产中您可能应该使用mktempPID 或将 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 {} \;

相关内容