Nhận rsync để tạo một tệp vá thay vì sao chép trên các tệp?


19

Tôi đang sao chép nhiều tệp đã thay đổi từ máy chủ này sang máy chủ khác bằng rsync. Tôi biết tôi có thể sử dụng -ntùy chọn để thực hiện chạy khô, vì vậy tôi có thể xem những tập tin nào đã được thay đổi. Tuy nhiên, có thể lấy rsync để in khác biệt nội dung tệp đã thay đổi không? Tôi muốn xem những gì đang xảy ra trước khi làm một bản sao? Một cái gì đó tôi có thể lưu vào một tập tin và áp dụng với diff (1) sau?

Câu trả lời:


8

Có thể có một cách tốt hơn, nhưng điều này có thể hoạt động, mặc dù không hiệu quả:

 rsync -vrn / dest:/ > ~/file_list

Sau đó chỉnh sửa kiểm tra để xóa số liệu thống kê, sau đó:

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

Tùy chọn khác:
Bạn cũng có thể xem xét việc gắn hệ thống tệp bằng một cái gì đó như sshfs / fuse, và sau đó chỉ sử dụng diff.


Lưu ý: Tôi đã không kiểm tra các lệnh đó ;-)
Kyle Brandt

Khởi đầu tốt, nhưng có vô số đầu ra bổ sung từ rsync, chẳng hạn như số liệu thống kê và "gửi danh sách tệp gia tăng", v.v.
Rory

Bạn có thể sử dụng --out-format = "% f"
Kyle Brandt

Nếu bạn sử dụng định dạng ngoài, hãy bỏ v và grep -v 'bỏ qua tệp không thường xuyên' ... Điều đó sẽ khiến nó khá sạch sẽ
Kyle Brandt

Chỉ cần kiểm tra xem có tình cờ có phương pháp mới / tốt hơn cho rsync --diffhai năm sau không ...
Đổ chuông

2

rsync không thể thực hiện điều này một cách tự nhiên, nhưng nếu có khả năng sử dụng unison, bạn có thể tạo định dạng kiểu khác từ đó.



1

Điều này không thể thực sự vì rsync chỉ quan tâm đến sự khác biệt nhị phân giữa các tệp.

Bạn có thể tạo kịch bản cho nó, sử dụng đầu ra của rsync. Nhưng nó sẽ là hackish.

Tôi thực sự tin rằng nó thực sự có thể với Unison .


1
Là của tôi những gì bạn có nghĩa là hackish? :-)
Kyle Brandt

Hoàn toàn có thể, Kyle: D
Dan Carley

1

Tại sao không chỉ sử dụng một cái gì đó như diff (cho tệp văn bản) hoặc xdelta (cho tệp nhị phân) để tạo khác biệt? Tại sao bạn cần đặc biệt nhận được một cái gì đó từ rsync?


Tôi không cần rsync, nhưng nó cần ở xa
Rory

Ôi không, ssh!
womble

1

Để mở rộng câu trả lời của Kyle, điều này tự động hóa quá trình. Lưu ý rằng nó hoàn toàn chưa được kiểm tra, có thể khá dễ vỡ và có thể xóa máy tính của bạn và giết con chó của bạn.

#!/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

Thuật toán rsync hoạt động bằng cách so sánh các khối nhị phân của tệp. Khác biệt nhị phân như vậy không có nghĩa là có thể in được. Có một lệnh được gọi là ndiff sử dụng thuật toán rsync để tạo khác biệt nhị phân, nhưng tôi không nghĩ nó hữu ích cho những gì bạn mô tả, nó thường được sử dụng để thực hiện sao lưu gia tăng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.