Bash:多模式匹配

5

我使用这个脚本将目录中的所有.png文件转换为.jpg文件。如果我想将不仅是png文件,而且还有tif、gif和bmp文件转换为jpg,该如何修改此脚本?

  #!/bin/bash
    for f in *.png ; do
        convert "$f" -resize 50% "${f%.*}.jpg"
    done
2个回答

11

只需添加您想要处理的扩展名即可,例如:

for f in *.png *.tif *.gif; do

或者只需:

for f in *.{png,tif,gif}; do

另一种方法可能是:查找目录或文件夹树中的所有图像文件并将它们转换为JPG格式,但如果图像已经是JPG文件,则不进行转换;例如(未经过测试):

find . -exec bash -c 'file "$1" | grep "image data" | grep -iv JPEG && convert "$1" -resize 50% "${1%.*}.jpg"' {} {} \; 

1
在没有找到png文件的情况下,有没有一种方法可以抑制f为“* png”?在包含所有jpeg的目录中执行“for i in *jpg png; do echo $i; done”会产生一个 png,除了预期的输出。 - Lucas Walter
1
找到了:http://unix.stackexchange.com/questions/56051/avoiding-errors-due-to-unexpanded-asterisk/56053#56053 对于所有的jpg和png文件,执行以下操作:如果$i存在或是一个符号链接,则继续执行;否则跳过该文件。最后输出$i的值。 - Lucas Walter

1

for f in *.{png,tif,gif,bmp}; do

在编程中,这段代码表示遍历当前目录下所有后缀名为 png、tif、gif 和 bmp 的文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接