运行 ubuntu 12.04,我想比较两个目录,比如 folder1/ 和 folder2/,并复制与 folder3/ 不同的任何文件。还有嵌套文件,因此匹配的子目录也应该被复制
有没有一个命令可以帮助我?我可以运行以下命令获取已更改文件的完整列表:
rsync -rcnC --out-format="%f" folder1/ folder2/
但 rsync 似乎无法将这些文件“导出”到不同的目标目录。我可以将列表通过管道传输到 cp 或其他程序,以便在复制文件的同时创建目录吗?例如,我尝试过
rsync -rcnC --out-format="%f" folder1/ folder2/ | xargs cp -t folder3/
但这也不能保留目录,它只会复制 folder3/ 内的所有文件
答案1
使用--compare-dest。
从手册页中:
--compare-dest=DIR - 此选项指示 rsync 使用目标计算机上的 DIR 作为附加层次结构来比较目标文件和进行传输(如果目标目录中缺少文件)。如果在 DIR 中找到与发送方文件相同的文件,则不会将该文件传输到目标目录。这对于创建仅包含与早期备份相比有所更改的文件的稀疏备份非常有用。
首先使用 --dry-run 检查语法
rsync -aHxv --progress --dry-run --compare-dest=folder2/ folder1/ folder3/
然后,一旦你对输出感到满意:
rsync -aHxv --progress --compare-dest=folder2/ folder1/ folder3/
这关联对 --compare-dest 范围有很好的解释。
答案2
这个小脚本应该可以工作:
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
但我也认为解析 diff -qr 的输出是一个更好的解决方案,因为它可以为每个文件提供一致的路径和名称。
编辑
这将是一条命令,您的命令略有修改。但它将folder1
在 下创建folder3
。并且它不适用于完整路径,而且上面的脚本也不适用于完整路径。
rsync -rcnC --out-format="\"%f\"" folder1/ folder2/ | xargs cp --parents -rfvt folder3/
我使用\"
它rsync
来处理包含空白的文件和目录。在 Ubuntu 10.04 上测试。希望对您有所帮助。
答案3
rsync -rcnC --out-format="%f" . ../folder2/ |xargs cp --parents -rt ../folder3/
folder1
如果您愿意在发出命令之前先深入了解一下,这是我能想到的最简单的形式。
这是慢点选项,但我相信它符合您的要求,并且可以使用非相对目录名执行:
rsync -rcnC --out-format="%n" folder1/ folder2/ |grep -vP "/$" |xargs -I{} rsync -R folder1/./{} folder3/
我没有改变你的原始rsync
命令,因为你说它给了你正确的文件列表(我的测试文件显然与你的不同,所以我不能肯定地说如果我弄乱它我会得到正确的文件列表)。
可以grep
从 的输出中删除目录名称rsync
。
然后使用将 的输出通过grep
管道传输到另一个。在参数中,extra用于告诉 rsync 创建以 开头的相对目录,而忽略。换句话说,它避免创建。rsync
xargs
folder1/./{}
./
./{}
folder1/
folder3/folder1/
我只能在 CentOS 6.4 上测试这个,但据我所知它在 Ubuntu 12.04 上应该也能正常工作。
编辑: 我应该指出史密斯的答案无疑更好,但我想尝试使用你原来的rsync
命令来做到这一点,因为它给了你想要的输出。