我想知道如何将 xargs 生成的命令发送到后台。例如,考虑
find . -type f -mtime +7 | tee compressedP.list | xargs compress
我试过
find . -type f -mtime +7 | tee compressedP.list | xargs -i{} compress {} &
..而且出乎意料的是,它似乎将 xargs 发送到后台?
如何使 compress 命令的每个实例进入后台?
我想知道如何将 xargs 生成的命令发送到后台。例如,考虑
find . -type f -mtime +7 | tee compressedP.list | xargs compress
我试过
find . -type f -mtime +7 | tee compressedP.list | xargs -i{} compress {} &
..而且出乎意料的是,它似乎将 xargs 发送到后台?
如何使 compress 命令的每个实例进入后台?
使用--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
以确保每个要压缩的文件都有一个新进程)
您可能可以制作一个非常快速的 shellscript 来调用 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 {} &
对于 SunOS,您可以查看 GNU Parallel http://www.gnu.org/software/parallel/
find . -type f -mtime +7 | tee compressedP.list | parallel compress
如果文件名包含 ' " 或空格,它还有一个额外的好处,即不会错误地终止。添加 -j+0 将使其每个 CPU 核心运行一次压缩。
当我想编辑所有包含 foo 的文件时,这对我有用
grep -rl foo ./ | `xargs emacs` &
在 SunOS/Solaris 上,将命令包装在对 sh(或其他 shell)的调用中:
find . -type f -mtime +7 | tee compressedP.list | xargs -Ifname sh -c 'compress fname &'
这应该在没有其他工具的情况下并行运行压缩。