在 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" 在指定范围内时打印文件路径
我有一个监控摄像头,它根据我给定的条件捕捉图像。图片保存在我的 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
[= 中提取 datetime 部分36=]d=${fn:10:-4}
- 从文件的 basename[[ $d -ge 20171020083000 && $d -le 20171022093000 ]] && echo "[=13=]"
- 仅当其 datetime "section" 在指定范围内时打印文件路径