在 Terminal/Linux 上查找包含特定日期范围文件名的所有文件

Find all files containing the filename of specific date range on Terminal/Linux

我有一个监控摄像头,它根据我给定的条件捕捉图像。图片保存在我的 Linux 上。图片命名约定如下-

CAPTURE04.YYYYMMDDHHMMSS.jpg

该目录包含以下文件 -

CAPTURE04.20171020080501.jpg
CAPTURE04.20171021101309.jpg
CAPTURE04.20171021101913.jpg
CAPTURE04.20171021102517.jpg
CAPTURE04.20171021103422.jpg
CAPTURE04.20171022103909.jpg
CAPTURE04.20171022104512.jpg
CAPTURE04.20171022105604.jpg
CAPTURE04.20171022110101.jpg
CAPTURE04.20171022112513.jpg ... and so on.

但是,实际上,现在我正在尝试使用终端命令找到一种方法来获取特定日期时间(文件名)范围内的所有文件。 注意:需要跟文件名(YYYYMMDDHHMMSS),而不是文件created/modified时间。

比如我需要获取文件名在2017-10-20 08:30:00和2017-10-22 09:30:00

之间的所有文件

我正在尝试搜索 google 并得到以下命令 -

find -type f -newermt "2017-10-20 08:30:00" \! -newermt "2017-10-22 09:30:00" -name '*.jpg'

它 returns 在给定日期范围内 created/modified 的文件。但我需要根据给定的文件名范围查找文件。所以我认为它不适用于我的情况。

也尝试使用以下命令-

find . -maxdepth 1 -size +1c -type f \( -name 'CAPTURE04.20171020083000*.jpg' -o -name 'CAPTURE04.2017102209300*.jpg' \) | sort -n

这不起作用.. :(

请帮我写出实际的命令。提前谢谢。

一种方式(bash),不是一种优雅的方式:

ls  CAPTURE04.2017102008{30..59}*.jpg CAPTURE04.2017102009{00..30}*.jpg 2>/dev/null

因为使用 maxdepth 选项意味着所有文件都在当前目录中,因此可以在循环中使用 globs

for file in CAPTURE04.201710{20..22}*.jpg; do
    if [[ $file > CAPTURE04.20171020083000 && $file < CAPTURE04.2017102209300 ]]; then
        ... do something with "$file"
    fi
done

完成找到+bash解决方案:

find . -type f -regextype posix-egrep -regex ".*CAPTURE04\.[0-9]{14}\.jpg" -exec bash -c \
'fn=${0##*/}; d=${fn:10:-4}; 
 [[ $d -ge 20171020083000 && $d -le 20171022093000 ]] && echo "[=10=]"' {} \;

  • fn=${0##*/} - 获取文件basename

  • d=${fn:10:-4} - 从文件的 basename

    [= 中提取 datetime 部分36=]
  • [[ $d -ge 20171020083000 && $d -le 20171022093000 ]] && echo "[=13=]" - 仅当其 datetime "section" 在指定范围内时打印文件路径