如何在find命令后使用xargs执行脚本

时间:2017-08-22 06:22:45

标签: unix

find . -name "recovery_script" | xargs

我尝试执行但只打印它。我怎么能并行运行它?

2 个答案:

答案 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

其中-n19nice的选项,而不是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