Dapatkan rsync untuk membuat file patch alih-alih menyalin seluruh file?

19

Saya menyalin banyak file yang telah berubah dari satu server ke server lain menggunakan rsync. Saya tahu saya bisa menggunakan -nopsi untuk menjalankan proses kering, jadi saya bisa melihat file apa yang telah diubah. Namun apakah mungkin untuk mendapatkan rsync untuk mencetak perbedaan dari isi file yang diubah? Saya ingin melihat apa yang terjadi sebelum menyalin? Sesuatu yang bisa saya simpan ke file dan terapkan dengan diff (1) nanti?

Rory
sumber

Jawaban:

8

Mungkin ada cara yang lebih baik, tetapi ini mungkin berhasil, meskipun tidak seefisien itu:

 rsync -vrn / dest:/ > ~/file_list

Kemudian edit tes untuk menghapus statistik, lalu:

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

Opsi lain:
Anda mungkin juga mempertimbangkan untuk memasang sistem file dengan sesuatu seperti sshfs / fuse, dan kemudian hanya menggunakan diff.

Kyle Brandt
sumber
Catatan: Saya tidak menguji perintah-perintah itu ;-)
Kyle Brandt
Awal yang baik, tetapi ada banyak output tambahan dari rsync, seperti statistik, dan "mengirim daftar file tambahan", dll.
Rory
Anda dapat menggunakan --out-format = "% f"
Kyle Brandt
Jika Anda menggunakan format-out, drop v, dan grep -v 'melewatkan file tidak biasa' ... Itu seharusnya cukup bersih
Kyle Brandt
Hanya memeriksa apakah secara kebetulan ada metode baru / lebih baik untuk rsync --diffdua tahun kemudian ...
Telepon Ø
2

rsync tidak dapat melakukan ini secara asli, tetapi jika ada kemungkinan menggunakan serentak Anda dapat menghasilkan format gaya berbeda dari itu.

Philip Reynolds
sumber
1

Itu tidak mungkin secara alami karena rsync hanya peduli tentang perbedaan biner antara file.

Anda mungkin dapat skrip itu, menggunakan output rsync. Tapi itu akan menjadi retas.

Saya percaya itu mungkin secara alami dengan Unison .

Dan Carley
sumber
1
Apakah milik saya yang Anda maksud dengan peretasan? :-)
Kyle Brandt
Tentu saja, Kyle: D
Dan Carley
1

Mengapa tidak menggunakan sesuatu seperti diff (untuk file teks) atau xdelta (untuk file biner) untuk menghasilkan diff? Mengapa Anda perlu secara khusus mendapatkan sesuatu dari rsync?

womble
sumber
Saya tidak perlu rsync, tetapi harus jauh
Rory
Oh noes, ssh!
womble
1

Untuk memperluas jawaban Kyle, ini mengotomatiskan proses. Perhatikan bahwa ini benar-benar belum diuji, mungkin sangat rapuh, dan dapat menghapus komputer Anda dan membunuh anjing Anda.

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

Algoritma rsync bekerja dengan membandingkan potongan biner file. Difer biner seperti itu tidak dimaksudkan untuk dicetak. Ada perintah yang disebut rdiff yang menggunakan algoritma rsync untuk menghasilkan diff biner, tapi saya pikir itu tidak akan berguna untuk apa yang Anda gambarkan, ini biasanya digunakan untuk mengimplementasikan backup inkremental.

sagi
sumber