เปรียบเทียบไดเรกทอรีขนาดใหญ่กับรายงานความคืบหน้า


13

ฉันเพิ่ง rsync-ed 2,000,000 ไฟล์ (3TB) จาก RAID หนึ่งไปยังอีก

ฉันต้องการตรวจสอบให้แน่ใจว่าข้อมูลของฉันยังคงอยู่

rsync -c ใช้เวลานานมาก

diff ไม่แสดงให้ฉันเห็นว่ากำลังทำอะไรอยู่

มีทางเลือกอื่นที่ (a) เร็วขึ้นและ (b) จะแสดงความคืบหน้าขณะที่กำลังเปรียบเทียบหรือไม่

(ฉันใช้ Mac และbrew search diffให้ฉันapgdiff colordiff diffstat diffutils fmdiff libxdiff open-vcdiff podiff rfcdiff vbindiff bsdiff diffpdf diffuse dwdiff kdiff3 ndiff perceptualdiff rdiff-backup tkdiff wdiff ... หนึ่งในนั้นจะทำงานได้หรือไม่)



ฉันสับสนว่าทำไมrsyncคัดลอกข้อมูลที่ประมาณ 150MB / s แต่diffเปรียบเทียบที่เพียง 60MB / s ... ?
Dan

1
การคัดลอกที่ใช้rsyncเร็วกว่า b / c rsyncโดยค่าเริ่มต้นไม่ได้ใช้ checksums เพื่อเปรียบเทียบไฟล์มันดูที่ขนาดและข้อมูลวันที่ เมื่อคุณใช้rsync -cไฟล์ทั้งหมดจะต้องมีการคำนวณ checksums ของพวกเขาซึ่งเป็นงานที่หนักหน่วงดังนั้นทำไมมันไม่ได้เป็นค่าเริ่มต้น
slm

ใช่ แต่ต่างไม่ได้คัดลอก ... มันแค่อ่านทั้งสองไฟล์; ในขณะที่ rsync เพื่อคัดลอกจะต้องอ่านแต่ละไบต์แล้วเขียน นี่เป็น rsync ตั้งแต่เริ่มต้นดังนั้นจึงเป็นการคัดลอกทุกไฟล์
Dan

คำตอบ:


6

แก้ไขเพื่อการแก้ไข & ตัวเลือกความชัดเจน - ฉันลืม '--brief'

diff -rs --brief "$dir1" "$dir2" 

-r, --recursive              recursively compare any subdirectories found
-s, --report-identical-files report when two files are the same
-q, --brief                  report only when files differ
--speed-large-files      assume large files and many scattered small changes

และเพิ่มตัวเลือกอื่น ๆ เพื่อลิ้มรสทั้งนี้ขึ้นอยู่กับสิ่งที่คุณกำลังเปรียบเทียบ:

-i, --ignore-case            ignore case differences in file contents
-b, --ignore-space-change    ignore changes in the amount of white space
-B, --ignore-blank-lines     ignore changes whose lines are all blank
--strip-trailing-cr      strip trailing carriage return on input
--ignore-file-name-case  ignore case when comparing file names

diff -rs จะอ่านทุกไบต์ของต้นฉบับและสำเนาและไฟล์รายงานที่เหมือนกัน

รูปแบบเอาต์พุตต่าง ๆ ถูกกำหนดโดย POSIX ดังนั้นมันจึงพกพาได้สวย คุณอาจต้องการเพิ่มสิ่งที่ชอบ:

| ที diff-out.1 | grep -v -Ee 'Files. * และ. * เหมือนกัน'

คุณสามารถใช้ chksums หรือ hashes ได้ แต่จากนั้นคุณต้องทำให้ข้อมูลเหล่านั้นตรงกันกับแผนผังไฟล์ดังนั้นคุณจะกลับไปอ่านทุกไบต์ของไฟล์ทุกไฟล์

แก้ไข - ยาวเกินกว่าจะแสดงความคิดเห็นได้เนื่องจาก:

ไฟล์ที่มีขนาดเกิน 10GB จะไม่ได้รับการตรวจสอบ

คุณอาจต้องการลองใช้ตัวเลือก diff นี้: - speed-large-files

เป็นไปได้ว่า diff ที่คุณใช้นั้นใช้งานไม่ได้ดีกับไฟล์ที่มีขนาดใหญ่มาก (ใหญ่กว่าหน่วยความจำระบบเป็นต้น) ดังนั้นจึงมีการรายงานความแตกต่างระหว่างไฟล์ที่เหมือนกัน

ฉันคิดว่ามีตัวเลือก -h หรือ 'bdiff' ซึ่งทำได้ดีกว่าในไฟล์ขนาดใหญ่ แต่ฉันหาไม่เจอใน Fedora ฉันเชื่อว่าตัวเลือก --speed-large-files เป็นตัวต่อของตัวเลือก '-h' "half-hearted compar"

วิธีที่แตกต่างคือการทำซ้ำคำสั่ง rsync ที่คุณใช้ด้วย '-vin' (verbose, itemize, no_run) สิ่งนี้จะรายงานความแตกต่างที่ rsync พบ - และไม่ควรมี

หากต้องการย้ายไฟล์บางไฟล์คุณกำลังดูสคริปต์ที่มีลักษณะดังนี้:

if [ cmp -s "$dir1/$path" "$dir2/$path" ] ; then 
target="$dir2/verified/$path"
mkdir -p $(basename "$target")
mv  "$dir2/$path" "$target"
fi

แต่ฉันไม่แนะนำให้ทำเช่นนั้น คำถามพื้นฐานคือ "ฉันจะแน่ใจได้อย่างไรว่า rsync คัดลอกลำดับชั้นของไฟล์อย่างถูกต้อง" และถ้าคุณสามารถแสดงให้คุณเห็นว่า rsync ทำงานได้ดีด้วย diff หรือเครื่องมืออื่น ๆ คุณก็สามารถใช้ rsync แทนการทำงานกับมัน

rsync -vin จะทำการเปรียบเทียบกับตัวเลือกอื่น ๆ ที่คุณมอบให้ ฉันคิดว่ามันเป็นค่าเริ่มต้นสำหรับ checksum แต่คุณพูดถูกต้อง -c หรือ --checksum นั้นเป็นสิ่งที่จำเป็น

ยูทิลิตี diff มีไว้สำหรับไฟล์บรรทัดข้อความ แต่ควรรายงาน 'ที่เหมือนกัน' ภายใต้ -s สำหรับไฟล์ไบนารี

- สั้น ๆ ควรระงับเอาท์พุทเนื้อหาไฟล์ใด ๆ - ฉันขอโทษสำหรับการมองเห็นก่อนหน้านี้ - มันถูกฝังกึ่งในสคริปต์ที่น่าเกลียด


มีวิธีใดที่จะนำmvไฟล์นี้ไปยังทุก ๆ ไฟล์ที่พบในโฟลเดอร์ "ที่ผ่านการตรวจสอบ" ที่รูทของไดรฟ์เพื่อรักษาเส้นทางแบบเต็ม? เช่นถ้า/disk1/a/b/c/file1เป็นไปเหมือนกันจากนั้นย้ายไปยัง/disk2/a/b/c/file1 /disk1/verified/a/b/c/file1จากนั้นฉันสามารถจบลงด้วยไฟล์ที่คัดลอกมาไม่ดี (จนถึงตอนนี้มีไฟล์มากมายเกินกว่า 10GB ที่ยังไม่ได้ตรวจสอบซึ่งน่ากลัว)
Dan

คุณอาจต้องการลองใช้ตัวเลือกนี้: - speed-large-files
D McKeon

มันทำอะไรกันแน่?
Dan

ถ้าฉันเรียกใช้rsync -vin- ไม่ทำการเปรียบเทียบแบบไบต์ต่อไบต์หรือการตรวจสอบ checksum หรือไม่ ฉันคิดว่า rsync เทียบเท่านั้นขนาดวันที่ / -cจนกว่าคุณจะเพิ่ม และจากสิ่งที่ฉันอ่านspeed large filesดูเหมือนว่าจะสร้างความแตกต่างกับไฟล์ที่ไม่ใช่ไบนารี ... หรือฉันผิด
Dan

diffให้ผลลัพธ์ฉันในรูปแบบของ"Files __ and ___ differ"... และฉันกำลังเรียกใช้ผ่านsed -e "s/Files /cp -afv /" -e "s/ and / /" -e "s/ differ$//"และพยายามที่จะสร้างสคริปต์สำหรับการคัดลอกไฟล์ที่ไม่ดีอีกครั้ง แต่เอาต์พุตของ diff ต่างกันโดยไม่มีการอ้างอิงจึงใช้งานไม่ได้ ฉันจะขอเส้นทางที่ยกมาให้ฉันได้ไหม
Dan

4

นี่คือdiffรายงานความคืบหน้าตามจำนวนไฟล์:

diff -rqs dir1 dir2 | pv -l -s filecount > logfile

คุณจะต้องมี pv (ไปป์): http://www.ivarch.com/programs/pv.shtml

คำอธิบาย:

  • diff -r เปรียบเทียบไดเรกทอรีและไดเรกทอรีย่อยซ้ำ
  • diff -qพิมพ์ชื่อไฟล์เท่านั้นที่แตกต่างกัน อย่าพิมพ์ความแตกต่างที่เกิดขึ้นจริง
  • diff -sพิมพ์ชื่อไฟล์ของไฟล์ที่ไม่แตกต่างกัน นี่เป็นสิ่งสำคัญสำหรับข้อมูลความคืบหน้า
  • pv -l รายงานความคืบหน้าตามจำนวนบรรทัด
  • pv -s count เวลาโดยประมาณให้เสร็จสมบูรณ์ตามจำนวน
  • การเปลี่ยนเส้นทางไปlogfileเป็นผลลัพธ์ที่ค่อนข้างดี มิฉะนั้นการส่งออกจากจะผสมกับสายสถานะจากdiffpv

เพื่อรับจำนวนไฟล์ใช้คำสั่งต่อไปนี้:

find dir1 -type f | wc -l

กรอง logfile สำหรับไฟล์ที่แตกต่าง:

grep -v "^Files .* identical$" logfile

ชุดรูปแบบนี้จะพิมพ์ไฟล์ที่แตกต่างกันตามเวลาจริงในขณะที่บันทึกทุกอย่างในlogfile:

diff -rqs dir1 dir2 | pv -l -s filecount | 
    tee logfile | grep -v "^Files .* identical$"

หรือคุณสามารถบันทึกเฉพาะไฟล์ที่แตกต่าง:

diff -rqs dir1 dir2 | pv -l -s filecount | 
    grep -v "^Files .* identical$" > logfile

หมายเหตุ: คำสั่งข้างต้นจะรายงานความคืบหน้าตามจำนวนไฟล์ วิธีนี้ใช้ได้ผลดีที่สุดหากมีไฟล์ขนาดเล็กจำนวนมาก หากคุณมีไฟล์ขนาดใหญ่ไม่กี่ไฟล์คุณจะไม่สนุกกับมันมากนัก

น่าเศร้าที่ฉันไม่รู้วิธีง่ายๆในการรายงานความคืบหน้าตามจำนวนไบต์เปรียบเทียบ


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

สำหรับรายละเอียดเพิ่มเติม:


0

ฉันจะดูการใช้แอปพลิเคชันแฮชบางประเภทเพื่อตรวจสอบความถูกต้องของข้อมูล ฉันรู้ว่ายูทิลิตีการค้นหาไฟล์ซ้ำซ้อนหลายรายการใช้แฮชเพื่อระบุสิ่งที่ซ้ำกัน / ไม่ซ้ำกัน ดูเหมือนว่านี่เป็นการสอบสวนที่อาจคุ้มค่า


0

คุณสามารถใช้rdiff-backupสำหรับสิ่งนั้นได้ ติดตั้งบนเซิร์ฟเวอร์ทั้งสองและจะทำการเปรียบเทียบ checksums อย่างชาญฉลาดและซิงค์สิ่งที่ยังไม่มี

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