我希望使用一个shell脚本来接受imagemagick脚本的目录的for循环。 shell脚本是这样的:
#!/bin/sh
# ~/scripts/mkhdr.sh
convert -gaussian $1 $2 - | composite -compose overlay $2 - $3
因此for循环:
for i in *.(tif|jpg);do;echo converting $i;~/scripts/mkhdr.sh 3 ./$i ./SSP_JPGs/$i:r.jpg;done
在没有空格的文件目录上正常工作。在文件名包含空格的目录上失败。
感谢Adrian Frühwirth,这是有效的:
#!/bin/sh
# ~/scripts/mkhdr.sh
convert -gaussian "$1" "$2" - | composite -compose overlay "$2" - "$3"
命令行:
for file in *.(tif|jpg);do;echo converting "${file}";~/scripts/mkhdr.sh 3 "${file}" "/Users/me/Desktop/${file}";done
答案 0 :(得分:2)
您发布的两个片段都有几个问题。让我们从第二个开始:
for i in *.(tif|jpg); do
echo converting $i
~/scripts/mkhdr.sh 3 ./$i ./SSP_JPGs/$i:r.jpg
done
zsh
的{{1}}语法,但由于您要搜索的是:r
和.jpg
个文件.tif
,因此无法解释:r.jpg
个文件。现在是第一个片段:
.tif
即使您在其他代码段中引用了变量,它们也会在此处被取消引用,而且带有空格的文件名将会成为问题。
现在让我们应用一些修补程序,从对话代码段开始:
#!/bin/sh
# ~/scripts/mkhdr.sh
convert -gaussian $1 $2 - | composite -compose overlay $2 - $3
和调用代码段:
#!/bin/sh
# ~/scripts/mkhdr.sh
convert -gaussian "$1" "$2" - | composite -compose overlay "$2" - "$3"
for file in *.tif *.jpg; do
echo "converting '${file}'"
~/scripts/mkhdr.sh 3 "${file}" "./SSP_JPGs/${file%.*}"
done
语法更改为*.(tif|jpg)
。这应该适用于所有*. tif *.jpg
,zsh
和bash
,但您不必使用此功能。ksh93
更改为$i:r.jpg
。这会从${i%.*}
的值后面删除.*
的短路匹配,这恰好是文件扩展名。这应该适用于所有i
,zsh
和bash
。答案 1 :(得分:1)
您可以使用read
;然后引用所有出现的$i
:
ls *.tif *.jpg | while read i; do
echo converting "$i";
~/scripts/mkhdr.sh 3 "./$i" "./SSP_JPGs/$i:r.jpg";
done
我不确定$i:r.jpg
部分,它将:r.jpg 附加到文件名??