在目录的每个级别上运行脚本

时间:2019-05-01 04:05:02

标签: linux bash unix directory-structure

我有一个名为summary.sh的脚本,该脚本可生成目录内文件/目录的摘要。我想让它从顶部递归地运行到整个树上。有什么好方法吗?

我尝试使用

的for循环将其循环
for dir in */; do
cd $dir
./summarize.sh
cd ..

但是它返回./summarize.sh:没有文件或目录 是因为我在运行脚本时没有移动脚本吗?我对Unix目录不是很熟悉。

3 个答案:

答案 0 :(得分:1)

您可以使用find . -type f递归列出文件,并使脚本将感兴趣的文件作为第一个参数,因此可以执行find . -type f -exec myScript.sh {} \;

如果仅希望使用目录,请改用find . -type d,或者如果希望两者都仅使用find .,则没有限制。

名称中的其他选项,例如find . -name '*.py'

最后,如果您不想递归目录结构,即仅汇总顶层目录,则可以使用-maxdepth 1选项,例如find . -type d -maxdepth 1 -exec myScript.sh {} \;

答案 1 :(得分:1)

问题是您正在使用cd命令切换到其他目录,而summary.sh脚本不在这些目录中。一种可能的解决方案是使用绝对路径而不是相对路径。例如,更改:

./summarize.sh

类似于:

/path/to/file/summarize.sh

或者,在给定的示例代码下,您也可以使用指向前面目录的相对路径,如下所示:

../summarize.sh

答案 2 :(得分:0)

如果运行的是Bash 4.0或更高版本,请尝试以下代码:

#! /bin/bash -p

shopt -s nullglob   # Globs expand to nothing when they match nothing
shopt -s globstar   # Enable ** to expand over the directory hierarchy

summarizer_path=$PWD/summarize.sh

for dir in **/ ; do
    cd -- "$dir"
    "$summarizer_path"
    cd - >/dev/null
done
  • shopt -s nullglob可以避免在当前目录下没有目录的情况下发生错误。
  • summarizer_path变量被设置为summarize.sh程序的绝对路径。为了使它可以在当前目录以外的目录中运行,这是必需的。 (./summarize.sh仅在当前目录.中起作用。)
  • 如果任何目录名以“-”开头,请使用cd -- ...避免出现问题。
  • cd - >/dev/nullcd到上一个目录,并在cd -输出时丢弃其路径。
  • Shellcheck发出有关上述代码的几条警告,所有与使用cd有关。我会为“真实”代码修复它们。