我有一个名为summary.sh的脚本,该脚本可生成目录内文件/目录的摘要。我想让它从顶部递归地运行到整个树上。有什么好方法吗?
我尝试使用
的for循环将其循环for dir in */; do
cd $dir
./summarize.sh
cd ..
但是它返回./summarize.sh:没有文件或目录 是因为我在运行脚本时没有移动脚本吗?我对Unix目录不是很熟悉。
答案 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/null
到cd
到上一个目录,并在cd -
输出时丢弃其路径。cd
有关。我会为“真实”代码修复它们。