2014-10-06 67 views
0

我正在使用腳本將我的文件夾中的所有圖像轉換爲觸發器操作。劇本是這樣的:Ubuntu隱藏文件夾中的所有圖像

for f in *.jpg; do 
    new="${f%%.jpg}_flop.jpg"; 
    convert "$f" -flop -quality 100 "$new"; 
done 

現在我已經發現有可能還與擴展.JPG我想添加一個新的循環看起來像這樣的圖片:

for f in *.JPG; do 
    new="${f%%.jpg}_flop.jpg"; 
    convert "$f" -flop -quality 100 "$new"; 
done 

我認爲,有一種忽略大小寫的語法,這樣我可以做一個循環而不是2,任何幫助?

更多的,如果還有擴展.jpeg.JPEG,那麼是否也有這樣的語法?

回答

1

你可以簡單地做

for f in *.jpg *.JPG; do 
    ... 

如果你想有一個單一的表達式,您可以在Bash中使用extglob擴展名。

set -o extglob 
for f in *[email protected]([email protected](|E)G|[email protected](|e)g); do 
    ... 

爲了使通配符不區分大小寫的,你可以shopt -s nocaseglob但沒有特定語法使一個單一的全局正則表達式不區分大小寫。

您也可以使用稍微不精確

for f in *.[Jj][Pp][Gg] *.[Jj][Pp][Ee][Gg]; do 
    ... 

匹配不區分大小寫。

+0

Last option works,but:1.我在擴展中遇到了一些問題:如果ext不是'new =「$ {f %%。here} _flop.jpg」後面提到的那個;''它將轉換爲文件file.here_flop.jpg。 2.設置-o extglob和shopt不適合我的情況,我不知道爲什麼(有什麼建議?)。 3.如果我沒有帶ext的文件(比如.jpeg),它會打印一些錯誤,但它會爲其他文件進行轉換 – sop 2014-10-06 11:37:38

+0

我可以推測你在shebang行上使用'#!/ bin/sh',它運行一個不同的shell,或者(在某些安裝上)禁用所有Bash特定擴展的Bash。 – tripleee 2014-10-06 12:27:05

0

東西沿着這些路線:

#/bin/bash 
shopt -s nullglob    # don't give error messages if no matching files 
shopt -s nocaseglob    # ignore case 
for f in *.jpg *.jpeg; do 

    new=${f/.[Jj][Pp][Ee][Gg]/}  # strip extension 
    new=${new/.[Jj][Pp][Gg]/}  # whether JPEG or jpg 
    new="$new_flop.jpg" 

    convert "$f" -flop -quality 100 "$new" 
done 
+0

'flop_all_images.sh:1:flop_all_images.sh:禁用了javascript:找不到 flop_all_images.sh:2:flop_all_images.sh:禁用了javascript:找不到 flop_all_images.sh:4:flop_all_images.sh:壞substitution' 如何啓用shopt? – sop 2014-10-06 09:23:19

+0

對不起,這是一個bash-ism。您需要'#!/ bin/bash'作爲第一行。 – 2014-10-06 09:24:44

+0

我已經添加了它,但仍然在說'shopt:not found'。仍然是'壞替代'。 – sop 2014-10-06 09:29:30

-1
for f in `ls * | grep -i "jp[e]\?g$"`;do 
    new="${f%%.jpg}_flop.jpg";  
    echo convert "$f" -flop -quality 100 "$new"; 
done 

正則表達式是你的朋友。

+0

語法錯誤:「|」意想不到的 – sop 2014-10-06 09:35:56

+0

我第一次失去反引號 – 2014-10-06 09:58:22

+0

-1 [不要解析'ls'輸出。](http://mywiki.wooledge.org/ParsingLs) – tripleee 2014-10-06 10:23:45

0

我有一個腳本,做類似的事情:

for file in {*.jpg,*.JPG}; do 
    mv "$file" "old$file" 
    convert -resize [email protected]\> "old$file" -quality 80 "$file" 
    rm "old$file" 
done 

我也做了一個視頻解釋它: https://www.youtube.com/watch?v=AG0bItQLBdI

+0

'{* .jpg,*。JPG}'將回顯打印爲'convert * .jpg,* .jpg,_flop.jpg'(etc) – sop 2014-10-06 11:40:04

+0

@sop:您的完整命令是什麼樣的? – 2014-10-06 16:00:42

+0

這是一個腳本,請參閱其他評論。該命令看起來像'for file in {* .jpg,*。JPG}; do new =「$ {f %%。jpg} _flop.jpg」;轉換「$ f」-flop -quality 100「$ new」; done',但我已經將它改爲'for * in *。[Jj] [Pp] [Gg] *。[Jj] [Pp] [Ee] [Gg]; do new =「$ {f %%。[Jj] [Pp] [Gg]} _ flop.jpg」;轉換「$ f」-flop -quality 100「$ new」;完成「,我只是得到了沒有這種擴展類型的錯誤。 – sop 2014-10-07 07:30:08