You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据文件名时间戳筛选白天拍摄的图片?

筛选白天延时照片并生成视频

问题核心

你的脚本未正确提取文件名中的小时值,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 13:30:40