我正在写一个bash脚本,需要删除旧文件。
它目前实现使用:
find $LOCATION -name $REQUIRED_FILES -type f -mtime +1 -delete
这将删除超过1天的文件。
然而,如果我需要一天,比如6小时前的更好的分辨率呢?有没有干净利落的方法,比如使用find和-mtime?
我正在写一个bash脚本,需要删除旧文件。
它目前实现使用:
find $LOCATION -name $REQUIRED_FILES -type f -mtime +1 -delete
这将删除超过1天的文件。
然而,如果我需要一天,比如6小时前的更好的分辨率呢?有没有干净利落的方法,比如使用find和-mtime?
你的查找有-mmin选项吗?它可以让你测试自上次修改以来的分钟数:
find $LOCATION -name $REQUIRED_FILES -type f -mmin +360 -delete
或者可以考虑使用tmpwatch来完成相同的工作。PHJR也在评论中推荐了tmpreaper。
对于 SunOS 5.10
Example 6 Selecting a File Using 24-hour Mode
The descriptions of -atime, -ctime, and -mtime use the ter-
minology n ``24-hour periods''. For example, a file accessed
at 23:59 is selected by:
example% find . -atime -1 -print
at 00:01 the next day (less than 24 hours later, not more
than one day ago). The midnight boundary between days has no
effect on the 24-hour calculation.
按照@iconoclast在另一个答案的评论中所思考的方式,一个人可以做些什么。
使用crontab为用户或/etc/crontab创建文件/tmp/hour:
# m h dom mon dow user command
0 * * * * root /usr/bin/touch /tmp/hour > /dev/null 2>&1
然后使用这个来运行你的命令:
find /tmp/ -daystart -maxdepth 1 -not -newer /tmp/hour -type f -name "for_one_hour_files*" -exec do_something {} \;
如果你的"find"版本中没有"-mmin",那么"-mtime -0.041667"将非常接近"最近一小时内",所以在你的情况下,使用:
-mtime +(X * 0.041667)
如果X表示6小时,则:
find . -mtime +0.25 -ls
有效是因为24小时* 0.25 = 6小时
以下是对我有效的方法(我没有看到上面使用它)
$ find /path/to/the/folder -name '*.*' -mmin +59 -delete > /dev/null
删除所有超过59分钟的文件,同时保持文件夹完整。
如果find没有-mmin,如果find只能接受-mtime的整数值,那么如果认为“比老”类似于“不比新”,那么不一定会丢失所有内容。
如果我们能够创建一个mtime为我们截止时间的文件,我们可以请求find来定位“不比”我们的引用文件“更新”的文件。
创建一个具有正确时间戳的文件有点复杂,因为一个没有足够查找功能的系统可能也有一个性能不佳的日期命令,可以执行以下操作:date +%Y%m%d%H% m% S -d "6小时前"。
幸运的是,其他的旧工具也可以做到这一点,尽管方式更加笨拙。
要想删除超过6小时的文件,我们首先要找到6小时前的时间。假设6小时是21600秒:
$ date && perl -e '@d=localtime time()-21600; \
printf "%4d%02d%02d%02d%02d.%02d\n", $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]'
> Thu Apr 16 04:50:57 CDT 2020
202004152250.57
由于perl语句产生了我们需要的日期/时间信息,所以使用它来创建一个恰好是6小时前的引用文件:
$ date && touch -t `perl -e '@d=localtime time()-21600; \
printf "%4d%02d%02d%02d%02d.%02d\n", \
$d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]'` ref_file && ls -l ref_file
Thu Apr 16 04:53:54 CDT 2020
-rw-rw-rw- 1 root sys 0 Apr 15 22:53 ref_file
现在我们有了一个6小时前的引用文件,“旧的UNIX”解决方案“删除所有超过6小时的文件”变成了如下内容:
$ find . -type f ! -newer ref_file -a ! -name ref_file -exec rm -f "{}" \;
清理一下我们的参考文件可能也是个好主意。
$ rm -f ref_file