2013-09-21 108 views
0

我有一個bash腳本,通過所有的子目錄給出一個目標目錄搜索(各級):指定多個目錄遞歸搜索

#! /bin/bash 

DIRECTORIES="/home/me/target_dir_1" 

for curr in $DIRECTORIES 
do 
    ... 

現在我希望腳本搜索多個目標的目錄,例如如target_dir_1, target_dir_2, target_dir_3。我應該如何修改腳本來做到這一點?

回答

3

使用find來代替。

find /home/me/target_dir_1 -type d 

你可以把一個for循環:

for d in target_dir_1 target_dir_2 
do 
    find /home/me/"$d" -type d 
done 

如果它總是/home/me,你要搜索下,所有的目錄,做follwing:

find /home/me -type d 
+0

感謝您的建議。但我認爲我正在尋找的答案只是如何爲變量'DIRECTORIES'指定多個目錄,並且腳本的其餘部分應該可以很好地處理任務。這樣做的正確語法是什麼? – ChrisG

3
#!/bin/bash 

GIVEN_DIR=$1 ## Or you could just set the value here instead of using $1. 

while read -r DIR; do 
    echo "$DIR" ## do something with subdirectory. 
done < <(exec find "$GIVEN_DIR" -type d -mindepth 1) 

運行於:

bash script.sh dir 

需要注意的是分詞是一個壞主意,所以不這樣做:

IFS=$'\n' 
for DIR in $(find "$GIVEN_DIR" -type d -mindepth 1); do 
    echo "$DIR" ## do something with subdirectory. 
done 

無論是與其他形式一樣時,你可以使用-print0find,雖然它的罰款,如果你還在用while

while read -r DIR -d $'\0'; do 
    echo "$DIR" ## do something with subdirectory. 
done < <(exec find "$GIVEN_DIR" -type d -mindepth 1 -print0) 

最後你可以記錄這些陣列上:

readarray -t SUBDIRS < <(exec find "$GIVEN_DIR" -type d -mindepth 1) 
for DIR in "${SUBDIRS[@]}"; do 
    echo "$DIR" ## do something with subdirectory. 
done 
2

說:

for i in /home/me/target_dir_{1..5}; do 
    echo $i; 
done 

這將導致:

/home/me/target_dir_1 
/home/me/target_dir_2 
/home/me/target_dir_3 
/home/me/target_dir_4 
/home/me/target_dir_5 

或者,也可以指定該變量作爲數組和環在它:

DIRECTORIES=(/home/me/target_dir_1 /home/me/target_dir_2 /home/me/target_dir_3) 
for i in ${DIRECTORIES[@]}; do echo $i ; done 

這將導致

/home/me/target_dir_1 
/home/me/target_dir_2 
/home/me/target_dir_3 
+0

那麼我如何初始化變量'DIRECTORIES'以包含多個目錄(並且它們並不總是遵循'target_dir_ *'模式.. – ChrisG

+0

@ChrisG創建數組(請參閱上面的編輯) – devnull

+0

這不適用於所有水平。 – konsolebox