并行查找并执行多个脚本

并行查找并执行多个脚本

你好,

我整个上午都在尝试解决这个问题,但没有成功。我想在特定文件夹中搜索某些脚本并并行执行它们。这些脚本有不同的名称,但都以“run.sh”结尾。下面是我尝试过但没有成功的方法。

第一种方法是将 find 与 -execdir 结合使用。这种方法可行,但是脚本是按顺序执行的。我希望所有脚本同时(并行)执行。似乎没有使用 -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 -c f\ \{\}

或者

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 "./{}" 

我真的很沮丧,希望有人能帮忙。非常感谢!

答案1

受到 choroba 的回答的启发:

find . -iname '*run.sh' -printf 'cd %h; ./%f\0' | xargs -L1 -0 -P0 bash -c

您可以使用-printf来构建命令行。%h是文件所在的目录,%f是文件的名称(不带路径)(基本名称)。该-P选项启用 中的并行性xargs,并-L1 -0使其对每个命令使用一个以空字符结尾的输入行。

答案2

那么如何创建您想要运行的命令行,然后运行它们呢?

find . -name '*run.sh' -type f -exec \
    echo 'c={}; cd ${c%/*} && nohup "./${c##*/}" &' \;

如果输出是您想要的,只需附加| bash并再次运行。

相关内容