วิธีที่ดีที่สุดในการเปรียบเทียบ (diff) โครงสร้างไดเรกทอรีแบบเต็ม?


29

วิธีที่ดีที่สุดในการเปรียบเทียบโครงสร้างไดเรกทอรีคืออะไร

ฉันมีอรรถประโยชน์สำรองข้อมูลที่ใช้rsync ฉันต้องการบอกความแตกต่างที่แน่นอน (ในแง่ของขนาดไฟล์และวันที่เปลี่ยนแปลงล่าสุด) ระหว่างแหล่งที่มาและการสำรองข้อมูล

สิ่งที่ต้องการ:

Local file                   Remote file                         Compare
/home/udi/1.txt (date)(size)   /home/udi/1.txt (date)(size)     EQUAL
/home/udi/2.txt (date)(size)   /home/udi/2.txt (date)(size)     DIFFERENT

แน่นอนว่าเครื่องมือสามารถสร้างขึ้นมาได้หรือไอเดียสำหรับสคริปต์ไพ ธ อน

ขอบคุณมาก!

Udi

คำตอบ:


18

เครื่องมือที่คุณกำลังมองหาคือrdiff มันทำงานเหมือนการรวม rsync และ diff มันสร้างไฟล์แพตช์ที่คุณสามารถเปรียบเทียบหรือแจกจ่าย


9

บางคนต้องการเปรียบเทียบระบบไฟล์ด้วยเหตุผลที่แตกต่างกันดังนั้นฉันจะเขียนที่นี่สิ่งที่ฉันต้องการและวิธีที่ฉันทำ

ฉันต้องการ:

  • เพื่อเปรียบเทียบระบบแฟ้มเดียวกันกับตัวเองคือภาพรวม , การเปลี่ยนแปลงแต่งหน้า , snapshot , เปรียบเทียบ
  • รายการของไฟล์ที่ถูกเพิ่มหรือลบไม่สนใจการเปลี่ยนแปลงไฟล์ภายใน

ฉันทำอะไรไป:

ภาพรวมครั้งแรก ( before.shสคริปต์):

find / -xdev | sort > fs-before.txt

ภาพรวมที่สอง ( after.shสคริปต์):

find / -xdev | sort > fs-after.txt

ในการเปรียบเทียบ ( diff.shสคริปต์):

diff -daU 0 fs-before.txt fs-after.txt | grep -vE '^(@@|\+\+\+|---)'

ส่วนที่ดีคือการใช้ไบนารีระบบเริ่มต้นที่ค่อนข้างสวย มันมีการเปรียบเทียบตามเนื้อหาที่สามารถทำได้ผ่านพารามิเตอร์ที่สะท้อนเส้นทางของไฟล์และ MD5 หลังจากนั้นfind-exec


8

หากคุณไม่ต้องการติดตั้งเครื่องมืออื่น ...

for host in host1 host2
do
  ssh $host ' 
  cd /dir &&
  find . |
  while
    read line
  do
    ls -l "$line"
  done ' | sort  > /tmp/temp.$host.$$
done
diff /tmp/temp.*.$$ | less
echo "don't forget to clean up the temp files!"

และใช่มันสามารถทำได้ด้วย find และ exec หรือ find และ xargs เช่นเดียวกับ find in for for loop และ, คุณสามารถเพิ่มเอาท์พุตของ diff ได้ดังนั้นมันจึงบอกว่า "ไฟล์นี้อยู่ใน host1 แต่ไม่ใช่ host2" หรือบางอย่าง แต่ ณ จุดนั้นคุณอาจติดตั้งเครื่องมือที่คนอื่นกำลังพูดถึง ...


5

ฉันเคยใช้diffiffในอดีตเพื่อเปรียบเทียบโครงสร้างไดเรกทอรี มันใช้งานได้เฉพาะบน dir ท้องถิ่นดังนั้นคุณจะต้องติดตั้งsshfsไดเรกทอรีอื่น ๆ ของคุณ

สิ่งที่ดีคือคุณสามารถมองเห็นได้ว่าไฟล์เท่ากันหรือไม่และไฟล์ใดที่ใหม่กว่าหรือเก่ากว่า และรองรับได้สูงสุด 5 ไดเรกทอรี คุณยังสามารถดูความแตกต่างและคัดลอกไฟล์จากที่หนึ่งไปยังอีกที่


4

จากหน้า rsync:

-n, --dry-run
This  makes rsync perform a trial run that doesn’t make any changes (and produces mostly
the same output as a real run).  It is most commonly used in combination  with  the  -v,
--verbose  and/or -i, --itemize-changes options to see what an rsync command is going to
do before one actually runs it.

อาจเป็นสิ่งนี้จะช่วย


ขอบคุณ แต่มันไม่ได้แก้ปัญหาของฉัน (ฉันกำลังมองหาความแตกต่างที่จะบอกความแตกต่างจริง ๆ )
Adam Matan

4

diff -rใช้งานได้ค่อนข้างดี หากคุณเพียงต้องการทราบว่าไฟล์ต่างกันหรือไม่ไม่ใช่เนื้อหาจริงของความแตกต่างให้ทำเช่นนั้นdiff -qr


1
-rหมายถึงการเรียกซ้ำไม่ได้เชื่อมต่อกับโฮสต์ระยะไกล!
Michael Hampton

3

ฉันจะใช้ Meld สำหรับสิ่งนั้น


Meld ทำงานได้ดีสำหรับเรื่องนี้หากคุณต้องการโซลูชัน GUI
Drew Noakes

2

นอกจากเครื่องมือที่กล่าวถึงแล้วใน windows คุณสามารถใช้ Total Commander หรือ WinSCP ได้ทั้งสองฟังก์ชั่นมีความสะดวกสบายมากในการเปรียบเทียบ (และซิงค์) ไดเรกทอรี


0

ฉันไม่ต้องการติดตั้งอะไรใหม่ดังนั้นทางออกของฉันค่อนข้างหยาบ แต่รวดเร็วและมีประสิทธิภาพ

ฉันต้องการเปรียบเทียบไฟล์ทั้งหมดที่ได้รับการคัดลอกและโหมดไฟล์ของพวกเขาความเป็นเจ้าของและบริบทความปลอดภัยของ SELinux นั้นยังคงไม่มีเทคโนโลยี

ดังนั้นฉันจึงวิ่ง:

rsync -aX /orig /copy/

แล้วเปรียบเทียบเช่นนี้

cd /orig && ls -lZR > /tmp/diff_orig
cd /copy && ls -lZR > /tmp/diff_copy
vimdiff /tmp/diff_*

หากเนื้อหาของไฟล์ทั้งสองยังคงถูกยุบอยู่ก็จะเหมือนกัน ถ้าไม่ต่างกันจะแสดงขึ้น

อัปเดตพารามิเตอร์ของlsเพื่อให้สะท้อนถึงคุณลักษณะที่คุณต้องตรวจสอบ YMMV

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