2012-10-21 85 views
0

我試圖將find命令的輸出存儲到數組中。Bash腳本:將帶有引號變量的find命令輸出到數組

我嘗試了不同的事情,似乎沒有任何工作,其中幾個在下面的評論線。我猜這個問題是「$ {findNameCmdSubDir [@]}」正在被標記化,並且打算從搜索中排除的目錄被忽略,並且所有目錄都被列出。

如果我給find命令而不將它傳遞給數組,即plain find命令,我會看到列出所有其他目錄(不包含排除項)的預期輸出。

#! /bin/bash 
android_path=$1 
excludeDirFromSearch=(doc build test unit-test script hardware prebuilt device .) 
let "dirCount = 0" 

findNameCmdSubDir=() 
for dir in "${excludeDirFromSearch[@]}"; do 
    if [ $((dirCount++)) -eq ${#excludeDirFromSearch[@]} ]; then 
      findNameCmdSubDir+=(-name "${dir}*") 
    else 
      findNameCmdSubDir+=(-name "${dir}*" -prune -o) 
    fi 
done 

searchSubDirectories=() 
searchSubDirectories=($(find "${android_path}" -mindepth 1 -maxdepth 1 \ 
"${findNameCmdSubDir[@]}" -type d)) <<-- Not Working! 
#find "${android_path}" -mindepth 1 -maxdepth 1 "${findNameCmdSubDir[@]}" \ 
# -type d | while read line; do 
#  echo "$line" 
#done <-- Not working 
find "${android_path}" -mindepth 1 -maxdepth 1 "${findNameCmdSubDir[@]}" \ 
    -type d -print <-- works as expected ! 

echo "${searchSubDirectories[@]}" 

更新

我試圖逃避雙引號和仍然沒有運氣

searchSubDirectories=($(find "${android_path}" -mindepth 1 -maxdepth 1 \"${findNameCmdSubDir[@]}\" -type d)) <<-- Not Working! 

回答

0

問題就出在這裏

searchSubDirectories=($(find "${android_path}" -mindepth 1 -maxdepth 1 \ 
"${findNameCmdSubDir[@]}" -type d)) 

你缺少一個-print末。


此外,關於該塊

for dir in "${excludeDirFromSearch[@]}"; do 
    if [ $((dirCount++)) -eq ${#excludeDirFromSearch[@]} ]; then 
      findNameCmdSubDir+=(-name "${dir}*") 
    else 
      findNameCmdSubDir+=(-name "${dir}*" -prune -o) 
    fi 
done 

擺脫這種

if [ $((dirCount++)) -eq ${#excludeDirFromSearch[@]} ]; then 
      findNameCmdSubDir+=(-name "${dir}*") 

你不需要它。您需要-prune -o您所有排除的目錄,也就是你完成的命令字符串應該有這種形式

find -name EXCLUDE1 -prune -o -name EXCLUDE2 -prune -o -type d -print 

與此相比,你心裏有什麼(如你預期,這將無法正常工作)

find -name EXCLUDE1 -prune -o -name EXCLUDE2 -prune -type d 
+0

的缺少'-print'與這個問題無關。請參閱'find(1)':*如果未給出表達式,則使用表達式-print *。 –

0

定義 「不工作」。你期望/想要達到的結果是什麼?什麼是實際結果?

如果find打印帶有空格的路徑和您想要把那些進入一個新的數組,嘗試process substitution而不是command substitution

findopts="-mindepth 1 -maxdepth 1 -type d" 
... 
searchSubDirectories=() 
while read dir; do 
    searchSubDirectories+=("$dir") 
done < <(find "${android_path}" $findopts "${findNameCmdSubDir[@]}") 

注意兩個<字符之間的空間!

相關問題