我想知道如何将xargs生成的命令发送到后台。 例如,考虑
find . -type f -mtime +7 | tee compressedP.list | xargs compress
我试过
find . -type f -mtime +7 | tee compressedP.list | xargs -i{} compress {} &
..并且出乎意料的是,似乎将xargs发送到后台了?
如何让compress命令的每个实例都转到后台?
答案 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 &'
这应该在没有其他工具的情况下并行运行压缩程序。