我有几个以下形式的目录:
my_dir/subdir*/qsub.sh
我想执行qsub.sh
每个子目录中的所有内容,但是当我尝试这样做时
sh my_dir/subdir*/qsub.sh
它似乎只qsub.sh
为单个子目录运行。为什么要这样做?
答案1
命令不起作用的原因是 shell 将执行第一个匹配项,其余匹配项将作为参数传递给第一个脚本。
您需要迭代目录并单独运行每个脚本。
例如
for script in my_dir/subdir*/qsub.sh ; do
sh "${script}"
done
答案2
正如 bxm 已经说过的: shell 正在将您的命令扩展为
sh my_dir/subdirA/qsub.sh my_dir/subdirB/qsub.sh my_dir/subdirC/qsub.sh
它my_dir/subdirA/qsub.s
与参数一起运行my_dir/subdirB/qsub.sh
my_dir/subdirC/qsub.sh
for 循环的替代方案可以是:
find my_dir -name qsub.sh -exec sh '{}' \;
给新手的扩展提示:
使所有脚本可执行(chmod +x
)并以适当的 shebang 开始(例如#!/usr/bin/env sh
)。然后,您可以通过使其可执行来启用脚本,您还可以使用其他脚本语言,如 python、perl 甚至二进制文件,而无需修改执行逻辑。
然后运行查找:
find my_dir -type f -executable -name qsub.sh -exec '{}' \;
查看人发现用于控制如何处理符号链接或搜索深度的选项。