我正在尝试使用 shell 查找任何目录中的所有子目录。我想要一个 .sh 文件(shell 脚本文件),它可以作为参数接收我感兴趣的目录的名称和我想要查找的文件列表(注意:我只想要包含所有这些文件的子目录)。
我知道我可以用这个:
find $D -perm -u=rx -type f
我认为 D 是目录,-u 是用户,r 是用户读取权限,x 是修改权限,但我不知道如何让文件接受参数,也不知道如何使用 -u=rx
编辑:我现在明白了如何使用 shell 脚本文件的参数,所以没关系。但我仍然不明白其余大部分内容。
如果有人可以解释我提到的代码或者提供替代方案我会很高兴?
我也可以接受部分答案,我只是需要一些帮助。
答案1
我会将您的要求解释为“查找包含所有特定文件的所有子目录”
#!/bin/bash
parent_dir="$1"
shift
find "$parent_dir" -type d |
while IFS= read -r subdir; do
all_present=true
for file in "$@"; do
if [[ ! -f "$subdir/$file" ]]; then
all_present=false
break
fi
done
$all_present && echo "$subdir"
done
“IFS=” 和“read -r”部分确保“dir”的值包含实际的目录名称,即使它包含空格或特殊字符。
答案2
如果我正确理解了你想要做什么,那么解决方案就是:
#!/bin/sh
USAGE="Usage: $0 dir file1 file2 ... fileN\nto find all subdirectories of dir that contain all the given files.\n"
if [ "$#" == "0" ]; then
printf "$USAGE"
exit 1
fi
ARG=""
DIR=$1
shift
while (( "$#" )); do
ARG="$ARG -exec test -e \"{}/$1\" \; "
shift
done
cmd="find $DIR -type d $ARG -print"
eval $cmd
它的作用是这样的:
用于find ... -type d
查找所有子目录(包括作为第一个参数给出的目录)。该test -e
命令检查文件是否存在。因此,对于给定的目录,我们必须检查命令行中给出的所有文件:test -e /path/to/directory/file1 test -e /path/to/directory/file2 test -e /path/to/directory/file3 ... is /path/to/directory
- {}
find 的单个结果。然后可以使用 find 参数-exec
来检查单个文件。要检查所有文件,-exec test
需要几个参数。因此,while 循环会构建一个包含这些参数的列表,然后将该列表放在一个命令中并进行评估。
玩得开心 ...