13

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

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

我试过

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

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

如何使 compress 命令的每个实例进入后台?

4

5 回答 5

18

使用--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以确保每个要压缩的文件都有一个新进程)

于 2011-05-26T11:30:46.237 回答
8

您可能可以制作一个非常快速的 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 {} &
于 2009-12-23T11:53:58.203 回答
5

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

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

如果文件名包含 ' " 或空格,它还有一个额外的好处,即不会错误地终止。添加 -j+0 将使其每个 CPU 核心运行一次压缩。

于 2010-06-10T18:59:42.843 回答
1

当我想编辑所有包含 foo 的文件时,这对我有用

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

于 2010-07-02T18:19:14.047 回答
0

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

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

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

于 2018-11-12T00:04:59.707 回答