并行查找并执行多个脚本

天儿真好,

我整个上午都试图解决这个问题,但没有成功。 我想在特定文件夹中搜索某些脚本并并行执行它们。 脚本有不同的名称,但都以“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并再次运行。