xargs并行tar管道

时间:2018-05-04 14:51:07

标签: parallel-processing pipe tar pipeline xargs

我尝试使用xargs使用tar创建/提取作业的并行管道来复制非常大的文件系统。我似乎无法弄清楚正确的语法。

find image -maxdepth 2 -mindepth 2 -type d -print|xargs -P 48 tar cf - --files-from|(cd /testfiles; tar xf -)

我收到这些错误:

  

xargs:tar:由信号13终止   xargs:tar:由信号13终止

但是如果我在没有-P选项的情况下执行相同的命令,它就会运行。它只是单线程,将永远在700K子目录中完成5000万个文件。

以下有效,但速度很慢:

find image -maxdepth 2 -mindepth 2 -type d -print|xargs tar cf - --files-from|(cd /testfiles; tar xf -)

那么我错过了什么?

2 个答案:

答案 0 :(得分:0)

问题是您的并行管道 stdout 正被来自|(cd /testfiles; tar xf -)的“单个” stdin 消耗

因此,您需要“同时”并行化tar xf -部分,可能的解决方案是将该管道视为“迷你脚本”,然后让xargs通过$@传递参数:

find image -maxdepth 2 -mindepth 2 -type d -print| \
  xargs -P 48 sh -c 'tar cf - --files-from $@ | tar -C /testfiles -xf -' -- 

顺便说一下,我还要小心-P 48,从更多节俭值开始,直到找到上述I / O影响的舒适权衡。

答案 1 :(得分:-1)

-n 1 中使用 xargs 将使 tar 与之前 find 命令的每个输出行一起运行。

find image -maxdepth 2 -mindepth 2 -type d -print|xargs -n 1 -P 48 tar cf - --files-from|(cd /testfiles; tar xf -)