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?

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.


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.



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 .


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?


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')

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.