如何删除两次之间创建的文件?

如何删除两次之间创建的文件?

我有一个用于备份数据库的文件夹,我想删除上午 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 脚本有两个主要部分:确定文件的“小时”时间戳,然后根据范围返回成功或失败。第一部分本身分为两部分完成。该变量被赋予命令替换的结果;该命令应从内到外阅读:

  1. $(stat -c %Y "$1")-- 这个(第二个)命令替换调用stat$1嵌入式 shell 脚本的参数上;$1被指定为find它找到的路径名之一。该stat命令的 %Y 选项返回自纪元以来的修改时间(以秒为单位)。
  2. 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

相关内容