为什么此命令没有按预期删除文件?

为什么此命令没有按预期删除文件?

我的脚本中的这个命令.sh应该查找/home/backup/VBtest文件.sql.gz并删除任何超过 5 天的文件:

find /home/backup/VBtest/*.sql.gz -mtime +5 -exec rm {} \;

但事实并非如此。它没有给我任何警告,没有错误,只是无声的失败。我在 CentOS 6.6 上运行它。

编辑- 在评论建议之后,我也尝试了这个find '/home/backup/VBtest' -name '*.sql.gz' -mtime +5 rm {} \;并得到了find: paths must precede expression: rm。另外,文件创建时间(相对于文件修改时间)的参数是什么?

答案1

它应该更像是:

find /home/backup/VBtest/  -name '*.sql.gz' -mtime +5 # -exec rm {} \;

(如果给出正确的结果,请从 exec 部分删除 #)这将扫描整个目录树。

/home/backup/VBtest/*.sql.gz其本身将被 shell 扩展(几乎相当于上面带有 -maxdepth 1 的 find 命令),您可以通过这样做来学习

echo /home/backup/VBtest/*.sql.gz 

如果愿意,您可以走纯 shell 路线。所有 posix shell 都可以比较时间戳([+-nt表示“更新于”或-ot表示“早于”),因此您只需要一个参考时间戳,然后按以下方式过滤扩展的 glob:

touch /tmp/5dAgo --date '5 days ago'
trap 'rm -f /tmp/5dAgo' exit
for file in /home/backup/VBtest/*.sql.gz; do
   #remove the echo if this give the expected results
   [ "$file" -ot /tmp/5dAgo ] && echo rm "$file" 
done

答案2

来自find的手册页:

    Numeric arguments can be specified as

   +n     for greater than n,
   -n     for less than n,
    n     for exactly n.

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

   -atime n
          File was last accessed n*24 hours  ago.   When  find  figures  out  
          how  many 24-hour  periods  ago  the  file  was  last  accessed, any 
          fractional part is ignored, so to match -atime +1, a file has to have 
          been accessed at least two days ago.

所以,-mtime +5会找到那些文件上一次更改更多的超过5*24小时之前并-mtime -5会找到最后修改的那些文件较少的比 5*24 小时前。它清楚地表明,如果您修改了文件,您的命令将不会删除这些文件。还可以尝试将命令修改为:

find /home/backup/VBtest/ -maxdepth 1 -name "*.sql.gz" -mtime +5 -exec rm {} \;

相关内容