获取rsync生成补丁文件,而不是跨文件复制?


19

我正在使用rsync将许多文件从一台服务器复制到另一台服务器。我知道我可以使用该-n选项进行试运行,因此可以查看已更改了哪些文件。但是,是否有可能使rsync打印出已更改文件内容的差异?我想看看在复制之前发生了什么?我可以保存到文件中,然后再用diff(1)应用吗?

Answers:


8

也许有更好的方法,但这可能行得通,尽管效率不高:

 rsync -vrn / dest:/ > ~/file_list

然后编辑测试以删除统计信息,然后:

while read file; do
    diff $file <(ssh dest "cat $file")
done < ~/edited_file_list

另一个选择:
您可能还考虑使用sshfs / fuse之类的文件系统来挂载文件系统,然后仅使用diff。


注意:我没有测试那些命令;-)
Kyle Brandt

一个好的开始,但是rsync有大量额外的输出,例如统计信息和“发送增量文件列表”等
Rory

您可以使用--out-format =“%f”
Kyle Brandt

如果您使用输出格式,请删除v和grep -v'跳过非常规文件'...这应该使它很干净
Kyle Brandt

只是检查是否有机会在rsync --diff两年后找到一种新的/更好的方法……
RingØ13年



1

这是不可能的,因为rsync只关心文件之间的二进制差异。

您可能可以使用rsync的输出编写脚本。但这将是骇人听闻的。

我确实相信Unison本身就有可能。


1
我的意思是hackish吗?:-)
凯尔·布​​兰特

绝对,凯尔(Kyle):D
丹·卡利

1

为什么不只使用diff(对于文本文件)或xdelta(对于二进制文件)之类的东西来生成差异?为什么您需要专门从rsync中获取一些东西?


我不需要rsync,但它需要远程
-Rory

哦,不,ssh!
womble

1

为了扩展凯尔(Kyle)的答案,这将使过程自动化。请注意,它完全未经测试,可能非常脆弱,可能会删除您的计算机并杀死您的狗。

#!/bin/bash

REMOTE=${1?Missing Remote Path}
LOCAL=${2?Missing Local Path}

# Trim trailing slash since we'll be adding it as a separator later
REMOTE=${REMOTE%/}
LOCAL=${LOCAL%/}

#Break it down
RHOST=${REMOTE%:*}
RPATH=${REMOTE#*:}

while read FILE; do
    diff -u ${LOCAL}/${FILE} <(ssh $RHOST "cat ${RPATH}/${FILE}")
done < <(rsync -vrn $REMOTE/ $LOCAL/ | sed '1d;/^$/q')

0

rsync算法通过比较文件的二进制块来工作。这样的二进制差异并不意味着可以打印。有一个名为rdiff的命令,该命令使用rsync算法生成二进制diff,但是我认为这对您描述的内容没有用,它通常用于实现增量备份。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.