比较2个目录并在第三个目录中复制差异

运行ubuntu 12.04,我想比较两个目录,比如说folder1 /和folder2 /,然后复制不同于folder3 /的任何文件。 还有嵌套的文件,所以应该复制匹配的子目录

有一个单一的命令可以帮助我吗? 我可以得到正在运行的已更改文件的完整列表:

rsync -rcnC --out-format="%f" folder1/ folder2/ 

但rsync似乎没有能力“导出”这些文件在不同的目标目录。 我是否可以将列表传递给cp或其他程序,以便在创build目录时复制这些文件? 例如,我试了一下

 rsync -rcnC --out-format="%f" folder1/ folder2/ | xargs cp -t folder3/ 

但是这不会保留目录,它只会复制folder3 /

    使用–compare-dest。

    从手册页:

    –compare-dest = DIR – 此选项指示rsync在目标计算机上使用DIR作为附加层次结构,以比较目标文件与传输(如果目标目录中缺less文件)。 如果在DIR中find与发件人文件相同的文件,则该文件不会被传输到目标目录。 这对于只创build从早期备份更改的文件的稀疏备份很有用。

    首先用–dry-run检查你的语法

     rsync -aHxv --progress --dry-run --compare-dest=folder2/ folder1/ folder3/ 

    那么一旦你对输出满意:

     rsync -aHxv --progress --compare-dest=folder2/ folder1/ folder3/ 

    这个链接对–compare-dest范围有很好的解释。

    这个小脚本应该可以工作:

     folder1="firsts_folder/" folder2="second_folder/" folder3="target_folder" for x in `rsync -rcnC --out-format="%n" $folder1 $folder2` do if [ -d "$folder1/$x" ]; then mkdir -p "$folder3/$x" else cp -frv $folder1/$x $folder3/$x fi done 

    但是我也认为parsingdiff -qr的输出会是一个更好的解决scheme,因为它可以为每个文件提供一致的path和名称。

    编辑

    这将是一个命令,你的命令稍作修改。 但是它会在folder3下创buildfolder1 。 而且它不适用于完整path,而且上面的脚本也不适用于完整path。

     rsync -rcnC --out-format="\"%f\"" folder1/ folder2/ | xargs cp --parents -rfvt folder3/ 

    我在rsync使用“ \"来使它与包含空格的文件和目录一起工作,在Ubuntu 10.04上testing,希望它有帮助。

     rsync -rcnC --out-format="%f" . ../folder2/ |xargs cp --parents -rt ../folder3/ 

    这是我能想出的最简单的forms,如果你愿意先下载到folder1然后发出命令。

    这是较慢的选项,但我相信它符合您的要求,并且可以使用非相对目录名来执行:

     rsync -rcnC --out-format="%n" folder1/ folder2/ |grep -vP "/$" |xargs -I{} rsync -R folder1/./{} folder3/ 

    因为你说它给了你正确的文件列表(我的testing文件明显不同于你的文件),所以我不能确定我会得到正确的文件列表,如果我搞砸了)。

    grep在那里从rsync的输出中删除目录名称。

    然后使用xargsgrep的输出传送到另一个rsync 。 在param folder1/./{} ,多余的./用于告诉rsync创build以./{}开头的相关目录,忽略folder1/ 。 换句话说,它避免了创buildfolder3/folder1/

    我只能在CentOS 6.4上进行testing,但是AFAIK在Ubuntu 12.04中应该是一样的。

    编辑:我应该注意到, 史密斯的答案无疑是更好的,但我想刺探你的原始rsync命令,因为它给你所需的输出。