2012-04-07 67 views
1

說我在一個目錄中,裏面有另一個名爲圖片的目錄,裏面有.jpg圖片,我想對「./operation image1.jpg」運行一個操作我該怎麼做爲目錄圖片中的每個JPG?當我搜索迭代目錄中的文件時,我無法獲得我想要的輸出。在Bash中的目錄中打印文件名

#!/bin/sh 

cd pictures 
pictures=$ls 

for pic in $pictures 
do 
    ./operation $pic 
done 

這就是我的代碼。我究竟做錯了什麼?

+0

如果'operation'接受多個文件參數,也許你可以簡單地做'操作圖片/ *。jpg' – tripleee 2012-04-07 06:48:50

回答

3

請勿使用ls來獲取文件列表,因爲這對文件名中的空格不起作用。原來是這樣的:

my file.jpg 
another file.jpg 

到:

my 
file.jpg 
another 
file.jpg 

bash處理FIL名單,你會不會遇到這個問題。只要記住引用的每個文件,使那些與他們空格都被保留全:

#!/bin/sh 
cd pictures 
for pic in *.jpg ; do 
    ./operation "$pic" 
done 
+0

好得多。 :-) – 2012-04-07 05:09:58

1

而且

find pictures/ -type f -name '*.jpg' -exec \./operation {} \; 
1

除了一個事實,即在文件名中的空間會造成問題,你的腳本會工作,但您的圖片= $ ls分配不正確。它應該是圖片= $(ls)...如果您需要考慮變量中的空格,請在其周圍放置雙引號:「$ var」...另外,請不要使用ls作爲您的文件名來源;它有其他方法避免的許多問題;例如,使用find或shell擴展,如paxdiablo的答案中所示。

find可以很好地控制您實際列出的內容以及處理方式。

這裏有幾個方法可以做到這一點。

# using find 
find -maxdepth 1 -type f -name '*.jpg' -exec ./operation "{}" \; 

# using an array 
pic=(*.jpg) 
for p in "${pic[@]}" ;do 
    ./operation "$p" 
done 

# You can (with care) even use ls ... but why would you? 
# I've just added it here to show the use of IFS (Input Field Seperator) 
IFS=$'\n' # this makes `\n` the only delimiter. 
pic=$(ls -1 *.jpg) 
for p in $pic ;do 
    ./operation "$p" 
done 
+0

FWIW,在find中使用「{}」並沒有什麼區別,因爲「{}」是由bash擴展的,{}是按find順序擴展的。 find會將{}展開爲單個參數,文件名中的空格無關緊要。 – pizza 2012-04-07 10:31:38

相關問題