运行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
的输出中删除目录名称。
然后使用xargs
将grep
的输出传送到另一个rsync
。 在param folder1/./{}
,多余的./
用于告诉rsync创build以./{}
开头的相关目录,忽略folder1/
。 换句话说,它避免了创buildfolder3/folder1/
。
我只能在CentOS 6.4上进行testing,但是AFAIK在Ubuntu 12.04中应该是一样的。
编辑:我应该注意到, 史密斯的答案无疑是更好的,但我想刺探你的原始rsync
命令,因为它给你所需的输出。