处理多个扩展

处理多个扩展

我已经编写了一个脚本将递归 .jpg 文件转换为其他大小:

echo $re
mkdir "$re"_tmp
for a in *.jpg ; do convert "$a" -resize $re "$re""_tmp/${a%.*} ["$re"].jpg" ; done

我想集成多扩展支持:png、bmp 等,更好的是:

FILEFORMAT="jpg, JPG, png, PNG, bmp, BMP"

有想法建造它吗?

PS:变量re是新的尺寸1024x768(或800x600等)

答案1

如果我理解正确的话,您想要处理具有其他扩展名的文件,而不仅仅是jpg.所以你可以尝试:

for a in *.{jpg,JPG,png,PNG,bmp,BMP}; do
  printf '%s\n' "$a"
  # do your stuff here
done

{...}bash 功能称为大括号扩展

答案2

您可以使用多个以空格分隔的 GLOB 表达式:

for a in *.[jJ][pP][gG] \
         *.[jJ][pP][eE][gG] \
         *.[pP][nN][gG] \
         *.[bB][mM][pP]
do
    echo "$a" "$re/$a"
done

# or inline
for a in *.[jJ][pP][gG] *.[jJ][pP][eE][gG] *.[pP][nN][gG] *.[bB][mM][pP] ; do echo "$a" "$re/$a"; done

不确定它是否兼容 POSIX,但我相信是的。

答案3

这是 POSIX 投诉变体:

for a in *.jp* *.JP*; do
  [ -f "$a" ] || continue
  echo "Processing $a"
done
  1. 在 POSIX 中,您可以放置​​多个用空格分隔的 GLOB
  2. 在现实生活中,扩展名是小写jpg或大写的以太JPG,但不是混合大小写。
  3. 如果没有任何JPG文件,那么 glob 将不会被扩展,并且 vara将有价值*.JP*。您必须通过检查 hte 文件是否存在来过滤掉它[ -f "$a" ]

相关内容