将xargs生成的命令发送到后台

时间:2009-12-23 11:35:15

标签: background xargs unix

我想知道如何将xargs生成的命令发送到后台。 例如,考虑

find . -type f  -mtime +7 | tee compressedP.list | xargs compress

我试过

find . -type f  -mtime +7 | tee compressedP.list | xargs -i{} compress {} &

..并且出乎意料的是,似乎将xargs发送到后台了?

如何让compress命令的每个实例都转到后台?

5 个答案:

答案 0 :(得分:13)

使用--max-procs / -P选项在后台运行xargs目标。从GNU xargs版本4.2.27的手册页:

  

- max-procs = max-procs,-P max-procs

     

一次运行max-procs进程;默认值为1.如果max-procs为0,则xargs将一次运行尽可能多的进程。将-n选项与-P一起使用;否则很可能只会有一名执行官。

(您可能希望将其与-n 1结合使用,以确保每个要压缩的文件都有一个新进程。

答案 1 :(得分:6)

你可以用一个非常快的shellcript来调用compress。

#!/bin/sh 
# call it 'compbg' and chmod a+x
compress $* &

然后

find . -type f  -mtime +7 | tee compressedP.list | xargs -I{} compbg {}

虽然我认为你可能会更乐意使用这个xargs参数:

 -P maxprocs
         Parallel mode: run at most maxprocs invocations of utility at once.

此命令应该一次找到/ tee / compress 10个文件,直到完成为止,并立即将控制权返回给调用脚本/ shell。

find . -type f  -mtime +7 | tee compressedP.list | xargs -I{} -P10 compress {} &

答案 2 :(得分:5)

对于SunOS,您可以查看GNU Parallel http://www.gnu.org/software/parallel/

find . -type f  -mtime +7 | tee compressedP.list | parallel compress

如果文件名包含'\ n'或空格,它还有一个额外的好处:添加-j + 0将使每个CPU核心运行一次压缩。

答案 3 :(得分:2)

当我想编辑包含foo

的所有文件时,这对我有用

grep -rl foo ./ | `xargs emacs`&

答案 4 :(得分:0)

在SunOS / Solaris上,将命令包装在对sh(或其他shell)的调用中:

find . -type f  -mtime +7 | tee compressedP.list | xargs -Ifname sh -c 'compress fname &'

这应该在没有其他工具的情况下并行运行压缩程序。