我的脚本中的这个命令.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 {} \;