如何按文件夹统计视频总时长并关联对应文件夹输出
如何按文件夹统计视频总时长并关联对应文件夹输出
看起来你已经摸到了统计视频总时长的门道,就差把时长和对应文件夹绑定起来这一步啦~我给你两个实用的方案,分别用mediainfo和ffprobe来实现,完美匹配你的需求:
方案一:用mediainfo实现(延续你已有的工具)
这个脚本会遍历父文件夹下的每个子文件夹,单独统计每个文件夹里的视频总时长,然后按你想要的格式输出:
#!/bin/bash # 替换成你的父文件夹实际路径,比如"/home/user/Parent folder/" PARENT_DIR="./Parent folder/" # 先输出父文件夹名称 echo "$(basename "$PARENT_DIR")" # 遍历父文件夹下的所有子文件夹 for FOLDER in "$PARENT_DIR"*/; do # 跳过非目录项(避免误处理文件) [ -d "$FOLDER" ] || continue # 获取子文件夹的名称 FOLDER_NAME=$(basename "$FOLDER") # 用mediainfo提取当前文件夹下所有MP4视频的时长(毫秒),并求和 TOTAL_MS=$(mediainfo '--Output=Video;%Duration%\n' "$FOLDER"*.mp4 | awk '{ sum += $1 } END { print sum }') # 将总毫秒数转换为小时和分钟 SECS=$((TOTAL_MS / 1000)) HOURS=$((SECS / 3600)) MINS=$(((SECS % 3600) / 60)) # 按照你的示例格式输出 echo "$FOLDER_NAME ${HOURS}h${MINS}m" done
使用说明:
- 把上面的代码保存成
count_video_length.sh文件 - 给脚本添加执行权限:
chmod +x count_video_length.sh - 运行脚本:
./count_video_length.sh
如果你的视频不止MP4格式,可以把"$FOLDER"*.mp4改成"$FOLDER"*.{mp4,mkv,avi,mov},覆盖常用的视频格式。
方案二:用ffprobe实现(FFmpeg套件工具)
如果你更习惯用FFmpeg生态的工具,这个方案同样可行:
#!/bin/bash PARENT_DIR="./Parent folder/" echo "$(basename "$PARENT_DIR")" for FOLDER in "$PARENT_DIR"*/; do [ -d "$FOLDER" ] || continue FOLDER_NAME=$(basename "$FOLDER") # 用ffprobe提取每个视频的时长(秒),再求和 TOTAL_SECS=$(ffprobe -v error -select_streams v:0 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1 "$FOLDER"*.mp4 | awk '{ sum += $1 } END { print sum }') # 转换为小时和分钟(用bc处理浮点运算,printf取整) HOURS=$(printf "%.0f" $(echo "$TOTAL_SECS / 3600" | bc)) MINS=$(printf "%.0f" $(echo "($TOTAL_SECS - $HOURS*3600) / 60" | bc)) echo "$FOLDER_NAME ${HOURS}h${MINS}m" done
额外提示:
- 确保你的系统已经安装了对应工具:Ubuntu/Debian可以用
sudo apt install mediainfo或sudo apt install ffmpeg(ffprobe属于FFmpeg套件) - 如果子文件夹还有嵌套的子目录,你可以把遍历逻辑改成
find "$PARENT_DIR" -type d,不过根据你的目录结构应该不需要这一步
备注:内容来源于stack exchange,提问作者John Snape




