遍历每个子文件夹,检查文件夹并运行脚本

遍历每个子文件夹,检查文件夹并运行脚本

我有一个目录,其中包含各种深度的子文件夹。我想遍历所有这些,检查它们是否包含具有特定名称的文件夹,如果该目录存在,则运行一个脚本(让我们调用此脚本foo.sh以避免混淆)。

foo.sh如果找到目标文件夹,则应在当前文件夹中运行。例子:

/A
  /subA-1
  /subA-2
    /target
  /subA-3
    /sub-subA-3
       /target

我正在查找的命令/脚本应从 运行/A,然后将遍历所有子文件夹,查找名为 的文件夹target。输入后,/subA-2满足此条件,然后运行/subA-2​​foo.sh。相同/sub-subA-3,但不是/subA-3

foo.sh不需要任何输入,它只需在包含/target.

答案1

就这么简单:

find A -type d -name target -execdir foo.sh \;

从手册页:

-execdir命令;

与 -exec 类似,但指定的命令是从包含匹配文件的子目录运行的。

例子:

根据问题创建并打印目录结构:

/tmp$ mkdir A; cd A
/tmp/A$ mkdir -p subA-1 subA-2/target subA-3/sub-subA-3/target
/tmp/A$ find .
.
./subA-2
./subA-2/target
./subA-3
./subA-3/sub-subA-3
./subA-3/sub-subA-3/target
./subA-1

现在运行命令,替换pwdfoo.sh显示发生了什么:

/tmp/A$ find . -type d -name target -execdir pwd \;
/tmp/A/subA-2
/tmp/A/subA-3/sub-subA-3

答案2

使用 zsh:

cd /A && for dir (**/target(/N:h) (cd -- $dir && foo.sh)

答案3

最简单的方法是使用find查找所有目录,然后修改脚本以检查是否foobar存在正确名称的目录(例如 ):

#!/bin/bash

targetDir="$@"   ## The directory to run the script on
dirName="target" ## Change this to whatever the "target" is
cd "$trargetDir"
## Exit if the $targetDir doesn't have a directory with 
## the name you're looking for
[ -d "$targetDir"/"$dirName" ] || exit

## If it does, cd into the $targetDir and continue the script
cd "$targetDir"

### The rest of the script goes here
...

现在,您可以运行find命令并让它在找到的每个目录上执行脚本:

find /target -type d -exec /path/to/script.sh "{}" \; 

您也可以完成整个事情find,但就我个人而言,我发现上述解决方案更干净。不过,这取决于你。这是一种方法:

pwd="$PWD"; find . -type d -name foobar -printf '%h\0' | 
    while IFS= read -d '' dir; do cd "$dir" && foo.sh; cd "$pwd"; done

答案4

使用查找命令:

人发现有一些例子:例如

find /tmp -name core -type f -print | xargs /bin/rm -f

find . -type f -exec file '{}' \;

相关内容