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)
但在这里它迫使我在两个日期之间间隔一段时间!我只想删除在两个特定时间之间创建的备份。
很简单,鉴于您标记了linux,您有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 脚本有两个主要部分:确定文件的“小时”时间戳,然后根据范围返回成功或失败。第一部分本身是由两部分完成的。变量被赋值为命令替换的结果;该命令应由内而外读取:
$(stat -c %Y "$1")-- 此(第二个)命令替换调用嵌入式 shell 脚本stat的$1参数;$1被分配find为它找到的路径名之一。stat命令的 %Y 选项返回以秒为单位的修改时间。date -d @ ... +%-H-- 这从上述命令替换中获取了自纪元以来的秒数,并要求date给我们那个时间的小时部分;该@语法告诉date我们正在给它秒钟,因为最划时代作为输入格式。使用-日期输出格式中的选项,我们告诉 GNU date不要用任何前导零填充值。这可以防止以后出现任何八进制错误解释。一旦我们$h分配了Hour 变量,我们就使用 bash 的条件运算符[[来询问该值是否大于或等于 11 并且还严格小于 15。