web-dev-qa-db-ja.com

ファイル間でコピーするのではなく、rsyncでパッチファイルを生成しますか?

Rsyncを使用して、あるサーバーから別のサーバーに変更された多くのファイルをコピーしています。 -n予行演習を行うオプション。変更されたファイルを確認できます。ただし、変更されたファイルの内容の差分をrsyncに出力させることは可能ですか?コピーする前に何が起こっているのか見たいのですが?ファイルに保存して、後でdiff(1)で適用できるものはありますか?

19
Rory

もっと良い方法があるかもしれませんが、これは効率的ではありませんが、うまくいくかもしれません:

 rsync -vrn / dest:/ > ~/file_list

次に、テストを編集して統計を削除し、次に:

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

別のオプション:
sshfs/Fuseのようなものでファイルシステムをマウントしてから、diffを使用することも検討してください。

8
Kyle Brandt

パッチを作成する場合:

rsync -arv --only-write-batch=patch old/ new/

適用するには:

rsync -arv --read-diff=patch dir/

または自動生成されたスクリプトを使用します。

./patch.sh

出典:

2
FarK

rsyncはこれをネイティブで行うことはできませんが、 nison を使用する可能性がある場合は、そこからdiffスタイルの形式を作成できます。

2
Philip Reynolds

Rsyncはファイル間のバイナリの違いのみを考慮するため、ネイティブでは不可能です。

Rsyncの出力を使用して、スクリプトを作成できる場合があります。しかし、それはハックになるでしょう。

私はそれが nison でネイティブに可能であると信じています。

1
Dan Carley

なぜdiff(テキストファイルの場合)またはxdelta(バイナリファイルの場合)などを使用してdiffを生成しないのですか?なぜrsyncから何かを特別に取得する必要があるのですか?

1
womble

カイルの答えを拡張するために、これはプロセスを自動化します。これは完全にテストされておらず、おそらく非常に壊れやすく、コンピュータを削除して犬を殺す可能性があることに注意してください。

#!/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')
1
tylerl

Rsyncアルゴリズムは、ファイルのバイナリチャンクを比較することで機能します。このようなバイナリdiffは、印刷可能であることを意味していません。 rsyncアルゴリズムを使用してバイナリdiffを生成する rdiff というコマンドがありますが、あなたが説明していることには役に立たないと思います。通常、増分バックアップの実装に使用されます。

0
sagi