2014-05-21 115 views
0

我想在陣列把結果命令find *.txt,然後遍歷數組了這樣申報陣列find命令的結果

for file in array 
do 

done 

我需要把數組,因爲以後我需要訪問到陣列。所以解決方案

for file in `find *.txt` 
do 

done 

對我不好。

+2

你爲什麼使用'find'? 'find * .txt'和'* .txt'之間沒有區別,除非你有名稱以'.txt'結尾的子目錄。你的意思是'發現。 -name'* .txt''? – Barmar

回答

1

使用數組賦值語法:

array=($(find *.txt)) 

如果可以有空格的文件名,你應該把

IFS=$"\n" 

上面的命令。如果文件名中可能有換行符,它會變得非常複雜,我不知道處理它的好方法。

然後你可以迭代它具有:

for file in "${array[@]}" 
+1

讓我們希望文件名中沒有空格......希望和祈禱!你膽大妄爲! –

1

如果使用bash 4,和你似乎沒有被使用的find任何其他功能除了它的能力通過子目錄遞歸,我建議使用globstar選項。

shopt -s globstar 
array=(**/*.txt) 

這避免了產卵在一個外部進程運行find,以及避免任何討厭的驚喜,如果任何匹配的文件的名稱中包含空格。

+0

他甚至沒有遞歸通過子目錄。 – Barmar

+0

然後可以使用更簡單的'array =(* .txt)'(它不需要'bash' 4)。這個替換假定他意味着使用'find。 -name'* .txt''。 – chepner

+0

+爲簡單起見,並且可以安全抵禦惡意文件名。 – John1024

1

如果你確定你沒有任何的換行符在你的文件名,mapfile是一個不錯的選擇:

mapfile -t array < <(find . -name '*.txt') 

現在,如果你想要更多的東西防彈,你可以使用:

mapfile -t array < <(find . -name '*.txt' -exec bash -c 'printf "%q\n" "${@:0}"' {} +) 
eval array=(${array[@]}) 

看到最後一行:eval和未加引號${array[@]},您應該感覺非常糟糕。它的工作原理是防彈的,因爲array是使用printf的'%q'修飾符構建的,所以一切都很好地轉義或引用,以便在這裏安全使用!

+1

對於'printf'%q \ n「'的很好的使用+1 – John1024

0

其他答案都有美德。作爲一種補充,在這裏是一種方法,其中(a)是即使在最困難的文件名安全,(二)允許充分利用find的力量,以及(c)避免eval

array=() 
while read -r -d $'\0'; do 
    array+=("$REPLY") 
done < <(find . -name '*.txt' -print0)