【发布时间】:2010-09-19 23:00:56
【问题描述】:
我正在编写一个需要删除旧文件的 bash 脚本。
目前使用:
find $LOCATION -name $REQUIRED_FILES -type f -mtime +1 -delete
这将删除超过 1 天的文件。
但是,如果我需要 1 天(比如 6 小时前)的更精细分辨率怎么办?有没有一种干净的方法,比如使用 find 和 -mtime?
【问题讨论】:
标签: bash
我正在编写一个需要删除旧文件的 bash 脚本。
目前使用:
find $LOCATION -name $REQUIRED_FILES -type f -mtime +1 -delete
这将删除超过 1 天的文件。
但是,如果我需要 1 天(比如 6 小时前)的更精细分辨率怎么办?有没有一种干净的方法,比如使用 find 和 -mtime?
【问题讨论】:
标签: bash
【讨论】:
$LOCATION 和$REQUIRED_FILES 都可以有多个值,例如dir1 dir2 和*.txt *.tmp ?
这是对我有用的方法(我没有看到它在上面使用)
$ find /path/to/the/folder -name '*.*' -mmin +59 -delete > /dev/null
删除所有超过 59 分钟的文件,同时保持文件夹不变。
【讨论】:
'*.*' 或 shell 将其扩展为实际文件名,而不是将其保留为通配符以供 find 解析。这打破了find 对子目录的递归操作。
-name '*.*'不会删除没有扩展名的文件,例如README、Makefile等。
-type f
您可以使用这个技巧:在 1 小时前创建一个文件,并使用 -newer file 参数。
(或者使用touch -t创建这样的文件)。
【讨论】:
touch -t $(date -d '-1 hour' +%Y%m%d%H%M.00) test 创建文件 test 总是 1 小时前。
-not -newer X来实现你想要的
-mmin 表示分钟。
尝试查看手册页。
man find
更多类型。
【讨论】:
适用于 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.
【讨论】:
如果一个人的find 没有-mmin,并且如果一个人也被一个find 卡住,它只接受-mtime 的整数值,那么如果一个人认为“早于”是类似于“不比”。
如果我们能够创建一个具有我们截止时间的 mtime 的文件,我们可以要求 find 找到“不比”我们的参考文件“新”的文件.
创建一个具有正确时间戳的文件有点麻烦,因为没有足够的find 的系统可能还有一个功能不足的date 命令,它可以执行以下操作:@ 987654328@.
幸运的是,其他旧工具可以解决这个问题,尽管方式更加笨拙。
要开始寻找删除超过六个小时前的文件的方法,我们首先必须找到六个小时前的时间。假设 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 语句产生了我们需要的日期/时间信息,所以使用它来创建一个正好有六个小时前的参考文件:
$ 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
现在我们有一个正好六小时前的参考文件,“删除所有超过六小时的文件”的“旧 UNIX”解决方案变成了以下内容:
$ find . -type f ! -newer ref_file -a ! -name ref_file -exec rm -f "{}" \;
清理我们的参考文件也可能是个好主意...
$ rm -f ref_file
【讨论】:
如果您的“find”版本中没有“-mmin”,那么“-mtime -0.041667”会非常接近“在过去一小时内”,因此在您的情况下,请使用:
-mtime +(X * 0.041667)
所以,如果 X 表示 6 小时,那么:
find . -mtime +0.25 -ls
有效,因为 24 小时 * 0.25 = 6 小时
【讨论】:
这是@iconoclast 在他们的comment 另一个答案中想知道的方式。
对用户使用 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 $PATH -name $log_prefix"*"$log_ext -mmin +$num_mins -exec rm -f {} \;
【讨论】: