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