我有一个目录,其中包含各种深度的子文件夹。我想遍历所有这些,检查它们是否包含具有特定名称的文件夹,如果该目录存在,则运行一个脚本(让我们调用此脚本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
现在运行命令,替换pwd
为foo.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 '{}' \;