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

如何编写shell脚本校验目录下图片/视频分辨率是否全部一致

问题解决

核心问题原因

你原有动态生成变量的命令无法生效的核心原因是:管道后调用的bash运行在独立子进程中,子进程的变量赋值不会同步到父shell,只有当你把生成的a1=xxx;a2=xxx指令直接粘贴到当前终端执行时,赋值操作才会在当前shell进程生效,因此你才会看到只有复制执行时才有效果。

最简实现方案

不需要动态生成变量,直接对所有输出的分辨率做去重统计即可,逻辑简单且兼容任意数量的文件:

仅校验jpg图片的脚本

#!/bin/bash
# 提取所有jpg分辨率,去重后统计行数
unique_res_count=$(find "$PWD" -iname "*.jpg" -type f -exec identify -format '%wx%h\n' '{}' \; | sort -u | wc -l)

if [ "$unique_res_count" -eq 1 ]; then
    echo "Okay"
else
    echo "Check the file resolution"
    exit 1
fi

兼容图片+视频的扩展脚本

如果需要同时校验视频分辨率,可以用ffprobe提取视频参数,组合逻辑如下:

#!/bin/bash
tmp_res_file=$(mktemp)
# 收集所有常见格式图片的分辨率
find "$PWD" \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" \) -type f -exec identify -format '%wx%h\n' '{}' \; >> "$tmp_res_file"
# 收集所有常见格式视频的分辨率
find "$PWD" \( -iname "*.mp4" -o -iname "*.mkv" -o -iname "*.mov" \) -type f -exec ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 '{}' \; >> "$tmp_res_file"

# 统计去重后的分辨率数量
unique_res_count=$(sort -u "$tmp_res_file" | wc -l)
rm -f "$tmp_res_file"

if [ "$unique_res_count" -eq 1 ]; then
    echo "Okay"
else
    echo "Check the file resolution"
    exit 1
fi

原有动态变量方案的兼容写法

如果你确实需要按原思路生成a1、a2等变量,使用eval在当前shell执行生成的指令即可,无需管道传给bash:

eval $(find $PWD -iname "*.jpg" -type f -exec identify -format '%i %wx%h\n' '{}' \;|awk '{print $NF}'|egrep -n "x"|sed 's#:#=#g'|sed 's#^#a#g'|paste -sd ";")

该方案不推荐用于生产环境,文件数量较多时会出现变量溢出、处理逻辑复杂等问题。

内容的提问来源于stack exchange,提问作者Technology EFX TV

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:45:02