如何移动或删除在特定时间范围内创建的文件?

如何移动或删除在特定时间范围内创建的文件?

我正在制作跨越数周的延时电影,并且想要删除夜间(即在本例中为 22:45 至 5:00 之间)拍摄的照片,我该如何轻松做到这一点?

我找到了以下部分解决方案:

  • find -newerXY具体使用-newermt是可能的,但也需要我循环遍历所有日期,
  • 用于stat查询 mtime,但我不知道如何在 bash 中轻松地比较时间。

我现在手动操作,但我确信一定有更优雅的解决方案。有什么想法吗?谢谢!:)

答案1

使用stat(假设所有文件位于同一目录中)

stat -c '%y %n' * | grep -E ' (22:4[5-9]|22:5|23:|0[0-4]:)' | cut -d ' ' -f 4 | xargs mv -t $dirForRemovedFiles
  • 这假设 stat 的输出不依赖于语言环境(似乎不是......),否则强制语言环境为“C”。
  • 假设所有文件都在同一个 DST 段中。
  • 注意引号和括号之间的空格,这使得正则表达式仅匹配时间戳的开头。
  • 为了安全起见,上面的命令不会删除任何内容,它只是将文件移动到一个目录中,rm *一旦您确认没有丢失任何内容,您就可以发出该目录。
  • 如果您比较偏执,请使用它grep -E '^.{10} (22:4[5-9]|22:5|23:|0[0-4]:)'来避免误击。

答案2

这一行半单行将会打印“夜间”文件:

( \
llimit=$((60*5+0)); \
ulimit=$((60*22+45)); \
find -type f -exec bash -c '\
hm=`stat -c "%y" "$0" | cut -c 12-16`; \
t=$((60*10#`echo $hm | cut -c 1-2`+10#`echo $hm | cut -c 4-5`)); \
test \( $t -lt $1 \) -o \( $t -gt $2 \)' \
{} $llimit $ulimit \; \
-print \
)

子行解释:

  1. 启动子 shell 以使变量变为本地变量。
  2. 计算午夜过后的下限(以分钟为单位)。
  3. 计算上限。
  4. 对于每个文件bash都会执行单独的操作;它将进行算术运算。
  5. 将 mtime 提取为HH:MM
  6. 转换HH:MM为午夜过后的分钟数值。
  7. 将该值与预先计算的限制进行比较。
  8. 这些是内部的参数bash;在内部,它们被称为$0$1$2
  9. 当且仅当前一个测试返回真时,才打印路径。
  10. 结束子 shell。

一些评论:

  • -exec可以充当调用中的测试。这几乎不明显,但非常强大。在这种情况下,当内部命令行的最后一部分(即)返回 true(即其退出状态为)find时,测试为 true 。bashtest0
  • Bash 算术 ( $((…))) 将01或 解析为八进制数,08并且09是无效的八进制数。这就是为什么我们需要使用10#来确保从stat输出中提取的所有数字都被解释为十进制。
  • 我使用了和-lt。如果您更适合,请使用和/或。-gttest-le-ge
  • 要删除文件,请用 替换-print-delete或一起使用:-print -delete)。
  • 要将文件移动到单个目录,请替换-print-print0构建如下管道:

    ( … find … -print0 ) | xargs -0r mv -t /target/directory/
    

相关内容