修复stat命令xargs占位符无法展开问题 批量查询多格式图片大小
问题原因
原脚本存在以下核心错误:
- 用单引号包裹了整段要执行的脚本,xargs的
_占位符在单引号内不会被替换,导致实际传入stat的路径是字面量_,自然找不到对应文件 - sed的扩展名替换逻辑没有限定匹配位置,可能误删路径中间出现的png/jpg字符
- 存在多处变量未加双引号的问题,遇到带空格的路径会直接报错
- 嵌套多层echo、管道、sh调用的写法逻辑过于绕,非常容易出现引号转义错误
修复后的可用脚本
find images -type f \( -name "*.png" -o -name "*.jpg" \) | while read -r srcimg; do # 定义获取文件大小的工具函数,找不到文件返回0 getimgsize() { stat -c "%s" "$1" 2>/dev/null || echo 0 } # 用shell内置参数扩展去掉源文件扩展名,无需调用sed srcimgnoext="${srcimg%.*}" # 读取三种格式的文件大小 srcimgsize=$(getimgsize "$srcimg") webpsize=$(getimgsize "${srcimgnoext}.webp") avifsize=$(getimgsize "${srcimgnoext}.avif") # 按要求格式输出 echo "$srcimg: $srcimgsize | webp: $webpsize | avif: $avifsize" done
优化点说明
- 改用
while read遍历find的输出结果,避免了xargs和sh嵌套调用的转义问题,逻辑更清晰 - 用shell内置的参数扩展
${srcimg%.*}处理扩展名,比调用sed性能更高,也不会出现匹配错误 - 所有变量都用双引号包裹,完美兼容带空格、特殊字符的文件路径
- 增加了错误处理逻辑,对应格式的文件不存在时会输出0,不会抛出多余的报错信息
内容的提问来源于stack exchange,提问作者Karen Grigoryan
相关产品推荐
相关产品推荐

