我正在制作跨越数周的延时电影,并且想要删除夜间(即在本例中为 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 \
)
子行解释:
- 启动子 shell 以使变量变为本地变量。
- 计算午夜过后的下限(以分钟为单位)。
- 计算上限。
- 对于每个文件
bash
都会执行单独的操作;它将进行算术运算。 - 将 mtime 提取为
HH:MM
。 - 转换
HH:MM
为午夜过后的分钟数值。 - 将该值与预先计算的限制进行比较。
- 这些是内部的参数
bash
;在内部,它们被称为$0
、$1
、$2
。 - 当且仅当前一个测试返回真时,才打印路径。
- 结束子 shell。
一些评论:
-exec
可以充当调用中的测试。这几乎不明显,但非常强大。在这种情况下,当内部命令行的最后一部分(即)返回 true(即其退出状态为)find
时,测试为 true 。bash
test
0
- Bash 算术 (
$((…))
) 将01
或 解析为八进制数,08
并且09
是无效的八进制数。这就是为什么我们需要使用10#
来确保从stat
输出中提取的所有数字都被解释为十进制。 - 我使用了和
-lt
。如果您更适合,请使用和/或。-gt
test
-le
-ge
- 要删除文件,请用 替换
-print
(-delete
或一起使用:-print -delete
)。 要将文件移动到单个目录,请替换
-print
并-print0
构建如下管道:( … find … -print0 ) | xargs -0r mv -t /target/directory/