使用 shell 查找包含特定文件的所有子目录

使用 shell 查找包含特定文件的所有子目录

我正在尝试使用 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 循环会构建一个包含这些参数的列表,然后将该列表放在一个命令中并进行评估。

玩得开心 ...

相关内容