指定多个目录以进行递归搜索

时间:2013-09-21 15:05:09

标签: bash

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

#! /bin/bash

DIRECTORIES="/home/me/target_dir_1"

for curr in $DIRECTORIES
do
   ...

现在我希望脚本能够搜索多个目标目录,例如target_dir_1, target_dir_2, target_dir_3。我该如何修改脚本来执行此操作?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

其他表单都没有,例如当-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

答案 2 :(得分: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