0

我有一个 bash 脚本,它在给定目标目录的情况下搜索所有子目录(在所有级别):

#! /bin/bash

DIRECTORIES="/home/me/target_dir_1"

for curr in $DIRECTORIES
do
   ...

现在我希望脚本搜索多个目标目录,例如target_dir_1, target_dir_2, target_dir_3. 我应该如何修改脚本来做到这一点?

4

3 回答 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,并且您想搜索其下的所有目录,请执行以下操作:

find /home/me -type d
于 2013-09-21T15:10:21.813 回答
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

也不能使用其他形式,比如当你可以使用-print0for时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
于 2013-09-21T15:11:13.643 回答
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
于 2013-09-21T15:12:10.363 回答