2011-02-28 81 views
1

我需要一個非常簡單的shell腳本來處理文件夾中的所有圖像並更改其大小。圖像處理是用gimp script-fu完成的,shell腳本唯一要做的就是for循環。在Shell腳本中混合命令和變量

我做了這個:

#!/bin/sh 

mkdir processed 
for image in `ls` 
do 
    if [ $image != "script.sh" ] 
    then 
     if [ $image != "processed" ] 
     then 
      gimp -i -b '(let* ((img (gimp-file-load 1 "1.jpg" "1.jpg")) (drw (gimp-image-get-active-drawable (car img)))) (gimp-image-scale-full 1 400 300 3) (file-jpeg-save 1 (car img) (car drw) "processed/1.jpg" "1.jpg" 0.6 0 1 1 "" 3 0 0 2) (gimp-quit 0))' 
     fi 
    fi 
done 

此代碼的工作,但是,在腳本福代碼,我把1.JPG作爲文件名,當然,我希望有出現的$的值圖像變量。我的shell腳本知識是有限的,並且我不得不將這個變量放在命令中。

你能幫我嗎?感謝您的時間:)

回答

2

使用for image in *而不是ls

要傳遞變量指向Gimp腳本並保存Gimp的引號,則需要用雙引號爲外部的和逃生內報價:

gimp -i -b "(let* ((img (gimp-file-load 1 \"$image\" \"$image\")) (drw (gimp-image-get-active-drawable (car img)))) (gimp-image-scale-full 1 400 300 3) (file-jpeg-save 1 (car img) (car drw) \"processed/$image\" \"$image\" 0.6 0 1 1 "" 3 0 0 2) (gimp-quit 0))" 

您還可以簡化您的腳本:

mkdir processed 
for image in *.jpg 
do 
    if [[ -f $image ]] 
    then 
     gimp ... 
    fi 
done 

如果您想要包含更多的擴展名:

for image in *.{jpg,JPG,jpeg,JPEG,gif,GIF,png,PNG} 
+0

謝謝。這解決了這個問題,你的建議表示讚賞。 – davidgnin 2011-02-28 14:52:31

0

你可以嘗試

"'(let* ((img (gimp-file-load 1 "$image" "$image")) (drw (gimp-image-get-active-drawable (car img)))) (gimp-image-scale-full 1 400 300 3) (file-jpeg-save 1 (car img) (car drw) "processed/$image" "$image" 0.6 0 1 1 "" 3 0 0 2) (gimp-quit 0))'" 
2

另一個approa ch可能更易讀:

mkdir processed 

gimp_script_template='(let* ( 
    (img (gimp-file-load 1 "%s" "%s")) 
    (drw (gimp-image-get-active-drawable (car img))) 
) 
    (gimp-image-scale-full 1 400 300 3) 
    (file-jpeg-save 1 (car img) (car drw) "processed/%s" "%s" 0.6 0 1 1 "" 3 0 0 2) 
    (gimp-quit 0) 
)' 

for img in *; do 
    [ ! -f "$img" ] && continue 
    [ "$img" = "script.sh" ] && continue 
    gimp_script="$(printf "$gimp_script_template" "$img" "$img" "$img" "$img")" 
    gimp -i -b "$gimp_script" 
done