我有一個bash腳本,通過所有的子目錄給出一個目標目錄搜索(各級):指定多個目錄遞歸搜索
#! /bin/bash
DIRECTORIES="/home/me/target_dir_1"
for curr in $DIRECTORIES
do
...
現在我希望腳本搜索多個目標的目錄,例如如target_dir_1, target_dir_2, target_dir_3
。我應該如何修改腳本來做到這一點?
我有一個bash腳本,通過所有的子目錄給出一個目標目錄搜索(各級):指定多個目錄遞歸搜索
#! /bin/bash
DIRECTORIES="/home/me/target_dir_1"
for curr in $DIRECTORIES
do
...
現在我希望腳本搜索多個目標的目錄,例如如target_dir_1, target_dir_2, target_dir_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
#!/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
無論是與其他形式一樣時,你可以使用-print0
爲find
,雖然它的罰款,如果你還在用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
說:
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
那麼我如何初始化變量'DIRECTORIES'以包含多個目錄(並且它們並不總是遵循'target_dir_ *'模式.. – ChrisG
@ChrisG創建數組(請參閱上面的編輯) – devnull
這不適用於所有水平。 – konsolebox
感謝您的建議。但我認爲我正在尋找的答案只是如何爲變量'DIRECTORIES'指定多個目錄,並且腳本的其餘部分應該可以很好地處理任務。這樣做的正確語法是什麼? – ChrisG