รับ rsync เพื่อสร้างไฟล์ปะแก้แทนที่จะคัดลอกข้ามไฟล์?


19

ฉันกำลังคัดลอกไฟล์จำนวนมากที่มีการเปลี่ยนแปลงจากเซิร์ฟเวอร์หนึ่งไปยังเซิร์ฟเวอร์อื่นโดยใช้ rsync ฉันรู้ว่าฉันสามารถใช้-nตัวเลือกเพื่อดำเนินการแบบแห้งดังนั้นฉันจึงสามารถดูไฟล์ที่เปลี่ยนแปลงได้ อย่างไรก็ตามเป็นไปได้ไหมที่ rsync จะพิมพ์ส่วนต่างของเนื้อหาไฟล์ที่เปลี่ยนแปลง? ฉันต้องการที่จะเห็นสิ่งที่เกิดขึ้นก่อนที่จะทำสำเนา? มีบางอย่างที่ฉันสามารถบันทึกลงในไฟล์และใช้กับ diff (1) ในภายหลังได้หรือไม่

คำตอบ:


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สองปีต่อมา ...
แหวนØ



1

ไม่สามารถทำได้เนื่องจาก rsync สนใจเฉพาะความแตกต่างแบบไบนารีระหว่างไฟล์เท่านั้น

คุณอาจสามารถใช้สคริปต์โดยใช้เอาต์พุตของ rsync แต่มันจะเป็นการแฮ็ก

ฉันเชื่อว่ามันเป็นไปได้โดยกำเนิดพร้อมเพรียงกัน


1
ฉันเป็นคนที่คุณตั้งใจทำอะไร :-)
Kyle Brandt

อย่างแน่นอน Kyle: D
Dan Carley

1

ทำไมไม่ใช้สิ่งต่าง ๆ เช่น diff (สำหรับไฟล์ข้อความ) หรือ xdelta (สำหรับไบนารีไฟล์) เพื่อสร้าง diffs? ทำไมคุณต้องเอาบางสิ่งออกจาก rsync โดยเฉพาะ?


ฉันไม่จำเป็นต้อง rsync แต่มันจะต้องมีระยะไกล
Rory

โอ้โหเอสเอส!
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 เพื่อสร้าง binary diff แต่ฉันไม่คิดว่ามันจะมีประโยชน์สำหรับสิ่งที่คุณอธิบาย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.