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

Ism*_*sei 4 linux date rm files

我有一个文件夹,我将数据库备份到其中,我想删除在上午 11 点到下午 3 点之间创建的所有备份,不管是哪一天——这就是问题所在!

我发现此命令非常有用,但不适用于我的用例:

find . -type f -newermt '01 nov 2018 00:00:00' -not -newermt '10 nov 2018 00:00:00' -delete
Run Code Online (Sandbox Code Playgroud)

但在这里它迫使我在两个日期之间间隔一段时间!我只想删除在两个特定时间之间创建的备份。

Jef*_*ler 5

很简单,鉴于您标记了,您有stat可用的命令,它将提取文件的修改时间,以及 GNUdate命令,它将从给定的时间中提取小时:

find . -type f -exec sh -c '
  h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 11 ] && [ "$h" -lt 15 ]' \
  sh {} \; -ls
Run Code Online (Sandbox Code Playgroud)

如果结果看起来正确,则:

find . -type f -exec sh -c '
  h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 11 ] && [ "$h" -lt 15 ]' \
  sh {} \; -delete
Run Code Online (Sandbox Code Playgroud)

这是该-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
Run Code Online (Sandbox Code Playgroud)

感谢 Kusalananda 撰写了我所遵循的出色答案,在:了解 `find` 的 -exec 选项

请注意,我们想要这里的{} +版本find,因为我们希望-exec结果是每个文件的,因此我们只删除与时间范围匹配的文件。

嵌入式 shell 脚本有两个主要部分:确定文件的“小时”时间戳,然后根据范围返回成功或失败。第一部分本身是由两部分完成的。变量被赋值为命令替换的结果;该命令应由内而外读取:

  1. $(stat -c %Y "$1")-- 此(第二个)命令替换调用嵌入式 shell 脚本stat$1参数;$1被分配find为它找到的路径名之一。stat命令的 %Y 选项返回以秒为单位的修改时间。
  2. date -d @ ... +%-H-- 这从上述命令替换中获取了自纪元以来的秒数,并要求date给我们那个时间的小时部分;该@语法告诉date我们正在给它秒钟,因为最划时代作为输入格式。使用-日期输出格式中的选项,我们告诉 GNU date不要用任何前导零填充值。这可以防止以后出现任何八进制错误解释。

一旦我们$h分配了Hour 变量,我们就使用 bash 的条件运算符[[来询问该值是否大于或等于 11 并且还严格小于 15。

  • @Kasper & Ismail,查看编辑 (4认同)
  • 确实,对@Kusalananda 赞不绝口!!! (3认同)
  • @杰夫·沙勒。请您解释一下,对于我这样的新手,`@$(stat -c %Y "$1")` 更具体地说是`@$` 和 `10#` 是什么意思!? (3认同)