說我在一個目錄中,裏面有另一個名爲圖片的目錄,裏面有.jpg圖片,我想對「./operation image1.jpg」運行一個操作我該怎麼做爲目錄圖片中的每個JPG?當我搜索迭代目錄中的文件時,我無法獲得我想要的輸出。在Bash中的目錄中打印文件名
#!/bin/sh
cd pictures
pictures=$ls
for pic in $pictures
do
./operation $pic
done
這就是我的代碼。我究竟做錯了什麼?
說我在一個目錄中,裏面有另一個名爲圖片的目錄,裏面有.jpg圖片,我想對「./operation image1.jpg」運行一個操作我該怎麼做爲目錄圖片中的每個JPG?當我搜索迭代目錄中的文件時,我無法獲得我想要的輸出。在Bash中的目錄中打印文件名
#!/bin/sh
cd pictures
pictures=$ls
for pic in $pictures
do
./operation $pic
done
這就是我的代碼。我究竟做錯了什麼?
請勿使用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
好得多。 :-) – 2012-04-07 05:09:58
而且
find pictures/ -type f -name '*.jpg' -exec \./operation {} \;
除了一個事實,即在文件名中的空間會造成問題,你的腳本會工作,但您的圖片= $ 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
FWIW,在find中使用「{}」並沒有什麼區別,因爲「{}」是由bash擴展的,{}是按find順序擴展的。 find會將{}展開爲單個參數,文件名中的空格無關緊要。 – pizza 2012-04-07 10:31:38
如果'operation'接受多個文件參數,也許你可以簡單地做'操作圖片/ *。jpg' – tripleee 2012-04-07 06:48:50