2014-02-09 76 views
1

我有一個bash腳本,我需要遍歷find命令輸出的每一行,但似乎我正在遍歷每個Word(空格分隔)的find命令。我的劇本是這樣的,到目前爲止:Bash腳本 - 遍歷find的輸出

folders=`find -maxdepth 1 -type d` 

for $i in $folders 
do 
    echo $i 
done 

我希望它可以給輸出,如:

./dir1 and foo 
./dir2 and bar 
./dir3 and baz 

但我insted的獲得輸出是這樣的:

./dir1 
and 
foo 
./dir2 
and 
bar 
./dir3 
and 
baz 

我是什麼在這裏做錯了嗎?

+0

另請參閱http://mywiki.wooledge.org/BashPitfalls中的答案#1 –

回答

5

既然你不使用任何的find更先進的功能,你可以用一個簡單的模式來遍歷子目錄:

for i in ./*/; do 
    echo "$i" 
done 
+0

+1 - 這是另一個正確的方法來做到這一點。 –

+0

這不是問題... – adius

13
folders=`foo` 

永遠是錯的,因爲它假定您的目錄將不包含空格,換行(是的,他們是有效的!),水珠字符等一個可靠的方法(這需要GNU擴展-print0)如下:

while IFS='' read -r -d '' filename; do 
    : # something with "$filename" 
done < <(find . -maxdepth 1 -type d -print0) 

另一種安全可靠的方法是讓find本身直接調用所需的命令:

find . -maxdepth 1 -type d -exec printf '%s\n' '{}' + 

UsingFind維基頁面以獲得對該主題的完整處理。

+1

請注意,「find ... -exec」表單僅適用於普通命令 - 如果要使用shell內建函數,shell函數,複合命令等,你需要使用'while ... done'方法或者'for'loop chepner建議。 –

+0

@GordonDavisson一般都是如此。但是,UsingFind wiki頁面(在我的答案中鏈接)描述了使用'-exec bash -c'...'_ {} +',它允許使用shell構建等。 –

2

你可以做這樣的事情:

find -maxdepth 1 -type d | while read -r i 
do 
    echo "$i" 
done 
+0

不安全。沒有正確處理包含反斜槓序列,換行符,多個空格字符運行等的文件名。 –

+0

@CharlesDuffy修復並檢查了'\'和空格 –

+0

...更好 - 用'-r'處理過反斜槓序列,但是你仍然在擴展球體,將空白的運行壓縮成單個字符,並且去除尾隨的空白。 –