6

我有一个监控摄像头,它根据我的给定条件捕获图像。图像保存在我的 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),而不是文件创建/修改时间。

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

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

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

它返回在给定日期范围内创建/修改的文件。但我需要根据给定的文件名范围查找文件。所以我认为它不适用于我的情况。

还尝试使用以下命令-

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

这不起作用.. :(

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

4

3 回答 3

4

完整的find + 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 "$0"' {} \;

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

  • d=${fn:10:-4}-从文件的基本名称中提取日期时间部分

  • [[ $d -ge 20171020083000 && $d -le 20171022093000 ]] && echo "$0"- 仅当其日期时间“部分”在指定范围内时打印文件路径

于 2017-10-26T10:40:52.233 回答
0

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

ls  CAPTURE04.2017102008{30..59}*.jpg CAPTURE04.2017102009{00..30}*.jpg 2>/dev/null
于 2017-10-26T10:25:27.547 回答
0

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

for file in CAPTURE04.201710{20..22}*.jpg; do
    if [[ $file > CAPTURE04.20171020083000 && $file < CAPTURE04.2017102209300 ]]; then
        ... do something with "$file"
    fi
done
于 2017-10-26T10:25:42.897 回答