如何根据文件名时间戳筛选白天拍摄的图片?
筛选白天延时照片并生成视频
问题核心
你的脚本未正确提取文件名中的小时值,h=${HOUR}是无效写法,需要通过正则匹配捕获小时部分后再做范围判断。
修正后的筛选脚本
以下脚本会遍历所有照片文件,提取文件名中的小时信息,筛选出8:00-17:00之间拍摄的文件:
find . -type f -name "photo_*.jpg" -exec bash -c ' fn=${0##*/} # 正则匹配文件名里的小时段 if [[ $fn =~ photo_[0-9]{4}-[0-9]{2}-[0-9]{2}_([0-9]{2}) ]]; then # 提取捕获到的小时字符串 h=${BASH_REMATCH[1]} # 转成十进制整数,避免前导零被识别为八进制(比如08) h=$((10#$h)) # 判断小时是否在目标范围内 if [[ $h -ge 8 && $h -le 17 ]]; then echo "$0" fi fi ' {} \;
生成延时视频
ffmpeg需要按时间顺序处理文件,先把筛选结果排序后传入:
# 筛选并排序文件,保存到临时列表 find . -type f -name "photo_*.jpg" -exec bash -c ' fn=${0##*/} if [[ $fn =~ photo_[0-9]{4}-[0-9]{2}-[0-9]{2}_([0-9]{2}) ]]; then h=${BASH_REMATCH[1]} h=$((10#$h)) if [[ $h -ge 8 && $h -le 17 ]]; then echo "$0" fi fi ' {} \; | sort > day_photos.txt # 用ffmpeg生成视频 ffmpeg -f concat -safe 0 -i day_photos.txt -c:v libx264 -r 24 -pix_fmt yuv420p timelapse_day.mp4
关键细节说明
- 用
[[ =~ ]]做正则匹配,BASH_REMATCH[1]存储第一个捕获组(即小时部分) 10#$h强制按十进制解析小时,解决08这类带前导零的字符串无法直接做数值判断的问题sort保证文件按时间戳顺序排列(文件名的字典序和时间顺序一致)- ffmpeg参数:
-r 24设置帧率为24帧/秒,可按需调整;-pix_fmt yuv420p保证视频在多数播放器上兼容
简化版(仅当前目录)
如果照片都在当前目录、无需遍历子目录,可直接用循环:
for file in photo_*.jpg; do if [[ $file =~ photo_[0-9]{4}-[0-9]{2}-[0-9]{2}_([0-9]{2}) ]]; then h=${BASH_REMATCH[1]} h=$((10#$h)) [[ $h -ge 8 && $h -le 17 ]] && echo "$file" fi done | sort > day_photos.txt
内容的提问来源于stack exchange,提问作者mmoollllee
相关产品推荐
相关产品推荐

