并行查找并执行多个脚本
天儿真好,
我整个上午都试图解决这个问题,但没有成功。 我想在特定文件夹中搜索某些脚本并并行执行它们。 脚本有不同的名称,但都以“run.sh”结尾。 低于我的尝试没有成功。
第一种方法是将find与-execdir结合使用。 然而,这是有效的,脚本以sequantial方式执行。 我希望所有脚本同时执行(并行)。 似乎没有选择用-execdir来实现这一点
find . -name "*run.sh" -type f -execdir 'nohup' {} '&' \;
然后,我尝试使用xargs,因为有一个并行选项(-P)。 我还没有尝试过并行选项,因为我无法让xargs在各自的子文件夹中运行脚本。 下面的命令执行所有脚本,但是在我运行命令的文件夹中执行此操作,因此脚本本身不起作用。 脚本必须在自己的子文件夹中执行。 在上面的示例中,-execdir正在执行此操作而不是-exec。 如何使用xargs实现这一目标?
nohup find . -name "*run.sh" -type f | xargs -0 -I{} bash -cf\ \{\}
要么
nohup find . -name "*run.sh" -type f | xargs -0 -I{} bash -c "f {}"
要么
nohup find . -name "*run.sh" -type f | xargs -0 -I{} bash -c "./{}"
我真的很沮丧,我希望有人可以提供帮助。 非常感谢!
灵感来自choroba的答案:
find . -iname '*run.sh' -printf 'cd %h; ./%f\0' | xargs -L1 -0 -P0 bash -c
您可以使用-printf
来构建命令行。 %h
是文件所在的目录, %f
是没有路径(基本名称)的文件的名称。 -P
选项在xargs
启用并行性, -L1 -0
使其在每个命令中使用一个以空值终止的输入行。
如何创建要运行的命令行,然后运行它们呢?
find . -name '*run.sh' -type f -exec \ echo 'c={}; cd ${c%/*} && nohup "./${c##*/}" &' \;
如果输出是你想要的,只需追加| bash
| bash
并再次运行。