我有一个 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
,并且您想搜索其下的所有目录,请执行以下操作:
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
for时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