我怎样才能使用并行选项时,通过多个子命令xargs的(How can I pass multiple

2019-10-20 09:41发布

我试图写一个bash脚本来处理大型目录树和rsync,在多个数据流。 从这个网站的其他研究中,我构建了以下内容。 假设是运行命令:

program.sh /输入/位置/输出/位置$线程

在我的脚本的关键线

cd $1; find . -depth \( -type d -printf \""%p/\"\n" \) | xargs -n1 -P$3 -I% rsync -lptgoDds --delete --backup --backup-dir=$INCREMENTALS/$DATE/$1 % $2/%

上述的想法是要找到在某一点处的所有目录和然后将它们传递到一个平行rsync命令的实例,以从$ 1中的数据复制到$ 2。

我遇到的问题是rsync的可能要创建尚未取决于投入是如何解析的存在嵌套的文件夹。 (至少我认为这就是我看到的错误的原因)。 为了解决这个问题,我想我可以发出的rsync中的两个命令。 第一个命令将使目录,第二个启动的rsync。

事情是这样的:

cd $1; find . -depth \( -type d -printf \""%p/\"\n" \) | xargs -n1 -P$3 -I% 'mkdir -p %;rsync -lptgoDdsv --delete % $2/%;'

但是,这似乎并没有任何工作。

所以,有玩这个有一段时间了,我伸手求助。 :-)

Answer 1:

你无法通过在单引号复杂的命令, xargs那样。 但是你可以将它传递给sh ,并传递给xargs

cd $1; find . -depth \( -type d -printf \""%p/\"\n" \) | xargs -n1 -P$3 -I% sh -c 'mkdir -p %;rsync -lptgoDdsv --delete % $2/%;'

(我有没有办法测试,这也许还需要一些调整。)



Answer 2:

这似乎从GNU并行的例子http://www.gnu.org/software/parallel/man.html#example__parallelizing_rsync是非常接近你想要什么:

cd src-dir; find . -type f -size +100000 | parallel -v ssh fooserver mkdir -p /dest-dir/{//}\;rsync -Havessh {} fooserver:/dest-dir/{}

相反,这应该工作:

cd $1; find . -depth -type d | parallel -P$3 mkdir -p $INCREMENTALS/$DATE/$1 $2/{}\; rsync -lptgoDds --delete --backup --backup-dir=$INCREMENTALS/$DATE/$1 {} $2/{}

如果GNU并行不是打包为您的系统,这应该在10秒内安装:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

要了解更多信息:留意简要介绍介绍视频: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

通过教程(男子parallel_tutorial)的步行路程。 你命令行一定会喜欢你的。



Answer 3:

刚回来并重新发布什么,我认为就是答案。 我不得不使用shell调用做什么,我需要做的,大量的试验后和错误它发生,我的答案是很简单的穿过田野到子shell。 通过导出他们,他们会提供给子壳,它就像一个魅力。 这里是我当前的脚本。

#!/bin/bash
set -x

export INCREMENTALS="/var/backup/data"
export DATE=`date +%F`
export SRCDIR=$1
export TARGETDIR=$2
export THREADS=$3


cd $SRCDIR; find . -type d -print0 | xargs -0 -n1 -P$THREADS -I {} sh -c 'echo $TARGETDIR/"{}"; mkdir -p $TARGETDIR/"{}"; rsync -lptgoDdXvz --delete --backup --backup-dir=$INCREMENTALS/$DATE/.$SRCDIR "{}"/ $TARGETDIR/"{}"'

要运行使用这个序列中的脚本:

rsync.sh /from/dir /to/dir 20

前两个参数是显而易见的,“20”是要调用的rsync的线程数。

于是就这样,你正在推动许多平行的rsync对排出机器的点。 我发现的唯一的问题在于,假如有许多数以千计的文件目录并行分崩离析,因为所有的人完成,你被卡住后面等待时间最长的一个。 我试图找出一种方法来为II一轮做多喷雾做法了。

我唯一的另一个问题是我现在的内存消耗随着时间的推移上升。 我有一种奇怪的感觉还有,这不是关系到我的剧本泄露,但我担心我会在这,这是造成不断不断增加内存的使用一些无界的元素。 不过这是要解决的另一个问题,无关的这一点。

净净的答案是“出口”的功能,然后将子壳正确地看到的内容和它的作品真的很好。



文章来源: How can I pass multiple sub-commands to xargs when using the parallel option
标签: bash find xargs