find . -name "recovery_script" | xargs
我尝试执行但只打印它。我怎么能并行运行它?
答案 0 :(得分:2)
find . -name "recovery_script" | xargs -n1 -P8 sh
并行处理8个进程 如果至少有8个地方可以找到“recovery_script”。
-n1
参数是一次将一个参数提供给sh
所必需的。否则,xargs
会同时向sh
提供合理数量的参数,这意味着它正在尝试执行类似
sh dir1/recovery_script dir2/recovery_script dir3/recovery_script ...
而不是
sh dir1/recovery_script
sh dir2/recovery_script
sh dir3/recovery_script
...
并行。
奖励:您的命令可能比单个命令更长,包括选项。我经常使用nice
来允许其他进程继续运行而不会出现问题:
find . -name "recovery_script" | xargs -n1 -P8 nice -n19
其中-n19
是nice
的选项,而不是xargs
的选项。
(旁白:如果您在-name
中使用find
的通配符,请使用-print0
选项find
和-0
选项xargs
1}}:用空字符分隔输出和输入,而不是空格(因为后者可能是文件名的一部分)。由于你在这里搜索全名,这不是问题。)
来自xargs
手册页:
大纲:
xargs
... [command [initial-arguments]]
和
...并使用任何初始参数执行命令(默认为/ bin / echo)一次或多次,后跟从标准输入读取的项目。
因此,默认行为是回显您为xargs
提供的任何参数。提供类似sh
的命令(可能取决于您尝试运行的可执行文件)然后工作。
答案 1 :(得分:1)
此解决方案不是使用xargs而是使用简单的bash脚本。也许它会有所帮助:
#!/bin/sh
for i in $(find -name recovery_script)
do
{
echo "Started $i"
$i
echo "Ended $i"
} &
done
wait