文件名含空格时ImageMagick批量转WebP脚本失效求助
解决Ubuntu 16.04下ImageMagick批量转WebP时含空格路径的问题
刚帮你排查了这个批量转换WebP时遇到的空格路径问题,核心原因是原脚本的路径读取方式没考虑到Shell的字段拆分规则,咱们来拆解问题并看修复方案:
原脚本的问题根源
你原脚本里用了for SRC in $(find $IMAGE_PATHS ...)这种写法,当文件名或文件夹名包含空格时,Shell会默认把空格作为字段分隔符,把一个完整的路径拆成多个独立的参数。比如images/cms B/fileA.png会被拆成images/cms和B/fileA.png,自然找不到对应的文件,导致转换失败。
修复后的完整脚本
#!/bin/bash # Convert all images to WebP IMAGE_PATHS="img/ modules/" find $IMAGE_PATHS -type f \( -iname "*.png" -o -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.gif" \) -print0 | sort -z | while read -r -d $'\0' SRC; do WEBP="${SRC%.*}.webp" if [ "$SRC" -nt "$WEBP" ]; then echo "Converting to $WEBP" convert "$SRC" -define webp:alpha-compression=1 -define webp:auto-filter=true -define webp:alpha-quality=90 -quality 95 "$WEBP" fi done
关键改进点解析
find -print0:让find输出的每个路径末尾用**null字符(\0)**分隔,而不是默认的换行符。null字符不会被Shell当成字段分隔符,完美解决空格、换行甚至特殊字符的路径识别问题。sort -z:配合-print0,用null字符作为分隔符对路径排序,保证文件处理顺序的一致性。read -r -d $'\0' SRC:-d $'\0'指定用null字符作为读取的分隔符,-r防止Shell对路径里的反斜杠进行转义,这样能完整读取每个带空格的路径到变量SRC中。-type f:明确只处理文件,避免误操作文件夹(虽然原脚本的后缀过滤也能规避,但加上更严谨)。-iname:忽略文件名大小写,能匹配PNG、JPG这类大写后缀的文件,比原脚本的-name兼容性更强。
额外优化建议
如果你的IMAGE_PATHS里包含带空格的路径,建议用数组来存储,避免路径被拆分:
IMAGE_PATHS=("img/" "modules/" "path with spaces/")
然后find命令改成:
find "${IMAGE_PATHS[@]}" -type f \( -iname "*.png" -o -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.gif" \) -print0 | sort -z | while read -r -d $'\0' SRC; do
内容的提问来源于stack exchange,提问作者Guigeek
相关产品推荐
相关产品推荐

