我尝试使用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 -)
那么我错过了什么?
答案 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 -)