我有一个用于备份数据库的文件夹,我想删除上午 11 点到下午 3 点之间创建的所有备份,无论今天是哪一天 - 这就是问题所在!
我发现这个命令非常有用,但不适用于我的用例:
find . -type f -newermt '01 nov 2018 00:00:00' -not -newermt '10 nov 2018 00:00:00' -delete
但在这里它迫使我在两个日期之间留出一个间隔!我只想删除两个特定时间之间创建的备份。
答案1
很简单,鉴于您已标记操作系统,您有stat
可用的命令,它将提取文件的修改时间,以及 GNUdate
命令,它将从给定时间提取小时:
find . -type f -exec sh -c '
h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 11 ] && [ "$h" -lt 15 ]' \
sh {} \; -ls
如果结果看起来正确,则:
find . -type f -exec sh -c '
h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 11 ] && [ "$h" -lt 15 ]' \
sh {} \; -delete
这是该版本的测试运行-ls
:
$ touch -d 'Wed Sep 12 11:00:01 EDT 2018' 11am
$ touch -d 'Wed Sep 12 12:00:02 EDT 2018' 12pm
$ touch -d 'Wed Sep 12 15:00:03 EDT 2018' 303pm
$ find . -type f -exec sh -c 'h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 11 ] && [ "$h" -lt 15 ]' sh {} \; -ls
1705096 0 -rw-r--r-- 1 user group 0 Sep 12 2018 ./11am
1705097 0 -rw-r--r-- 1 user group 0 Sep 12 2018 ./12pm
感谢 Kusalananda 写了我遵循的出色答案,网址为:了解“find”的 -exec 选项
请注意,我们这样做不是想要这里{} +
的版本find
,因为我们希望-exec
结果是每个文件,这样我们就只删除与时间范围匹配的文件。
嵌入式 shell 脚本有两个主要部分:确定文件的“小时”时间戳,然后根据范围返回成功或失败。第一部分本身分为两部分完成。该变量被赋予命令替换的结果;该命令应从内到外阅读:
$(stat -c %Y "$1")
-- 这个(第二个)命令替换调用stat
在$1
嵌入式 shell 脚本的参数上;$1
被指定为find
它找到的路径名之一。该stat
命令的 %Y 选项返回自纪元以来的修改时间(以秒为单位)。date -d @ ... +%-H
-- 这从上述命令替换中获取自纪元以来的秒数,并要求date
我们提供该时间的小时部分;这@
句法告诉date
我们我们将自纪元以来的秒数作为输入格式。通过-
日期输出格式中的选项,我们告诉 GNU 日期不是用任何前导零填充该值。这可以防止以后出现任何八进制错误解释。
一旦我们$h
分配了 Hour 变量,我们就使用 bash 的条件运算符[[
来询问该值是否大于或等于 11 并且严格小于 15。
答案2
不理想,但这可能有用。
find . -type f -print | while read l; do
hour=$(stat -c "%z" ${l} | awk '{print $2}' | awk -F: '{print $1}')
if [[ 11 -le ${hour} ]] && [[ ${hour} -le 15 ]]; do
rm -f ${l}
done
done