rsync: ความแตกต่างระหว่าง --size-only และ --ignore-times


114

ฉันพยายามทำความเข้าใจว่าความแตกต่างระหว่างสองตัวเลือกคืออะไร

rsync --size-only

และ

rsync --ignore-times

เป็นความเข้าใจของฉันว่าโดยค่าเริ่มต้น rsync จะเปรียบเทียบทั้งการประทับเวลาและขนาดไฟล์เพื่อตัดสินใจว่าควรซิงโครไนซ์ไฟล์หรือไม่ ตัวเลือกด้านบนอนุญาตให้ผู้ใช้มีอิทธิพลต่อพฤติกรรมนี้

ตัวเลือกทั้งสองดูเหมือนอย่างน้อยด้วยวาจาเพื่อผลในสิ่งเดียวกัน: การเปรียบเทียบตามขนาดเท่านั้น

ฉันพลาดอะไรบางอย่างที่ละเอียดอ่อนที่นี่?


18
สิ่งนี้น่าจะเหมาะกับบางสิ่งเช่นSuperUser.comหรือUnix.SEเนื่องจากเป็นเรื่องเกี่ยวกับการใช้เครื่องมือที่มีอยู่ (ไม่เกี่ยวข้องกับการเขียนโปรแกรม) แทนที่จะเป็นอะไรที่เกี่ยวข้องโดยตรงกับการเขียนโค้ด
Jerry Coffin

คำตอบ:


110

มีหลายวิธีที่ rsync เปรียบเทียบไฟล์ - แหล่งเผด็จการเป็นคำอธิบายขั้นตอนวิธี rsync: https://www.andrew.cmu.edu/course/15-749/READINGS/required/cas/tridgell96.pdf บทความวิกิพีเดียใน rsync ยังดีมาก

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

ไฟล์ที่มีขนาดเท่ากันอาจยังคงมีการเปลี่ยนแปลง ตัวอย่างง่ายๆคือไฟล์ข้อความที่คุณแก้ไขการพิมพ์ผิดเช่นการเปลี่ยน "teh" เป็น "the" ขนาดไฟล์เท่ากัน แต่ไฟล์ที่ได้รับการแก้ไขจะมีการประทับเวลาที่ใหม่กว่า --size-onlyพูดว่า "อย่าดูเวลาถ้าตรงกับขนาดถือว่าไฟล์ตรงกัน" ซึ่งอาจเป็นตัวเลือกที่ไม่ถูกต้อง

บนมืออื่น ๆ เช่นสมมติว่าคุณตั้งใจทำขนาดใหญ่cp -r A Bเมื่อวานนี้ rsync B Aแต่คุณลืมที่จะรักษาเวลาประทับและตอนนี้คุณต้องการจะทำดำเนินการในสิ่งที่ตรงกันข้าม ไฟล์ทั้งหมดที่คุณ cp'ed มีการประทับเวลาของเมื่อวานแม้ว่าจะไม่ได้แก้ไขเมื่อวานนี้ก็ตามและ rsync จะสิ้นสุดการคัดลอกไฟล์เหล่านั้นทั้งหมดและอัปเดตการประทับเวลาเป็นเมื่อวานนี้ด้วย --size-onlyอาจเป็นเพื่อนของคุณในกรณีนี้ (โมดูโลตัวอย่างด้านบน)

--ignore-timesกล่าวว่าให้เปรียบเทียบไฟล์โดยไม่คำนึงว่าไฟล์นั้นมีเวลาแก้ไขเท่ากันหรือไม่ ลองพิจารณาตัวอย่างการพิมพ์ผิดด้านบน แต่คุณไม่เพียง แต่แก้ไขการพิมพ์ผิด แต่คุณเคยtouchทำให้ไฟล์ที่แก้ไขมีเวลาแก้ไขเท่ากับไฟล์ต้นฉบับ - สมมติว่าคุณส่อเสียดด้วยวิธีนั้น ดี--ignore-timesจะทำต่างของไฟล์ที่แม้ขนาดและเวลาการแข่งขัน


58

คำตอบสั้น ๆ คือ--ignore-timesมันมีความหมายมากกว่าชื่อ ไม่สนใจทั้งเวลาและขนาด ตรงกันข้าม--size-onlyทำตามที่พูด


คำตอบยาว ๆ คือrsyncมีสามวิธีในการตัดสินใจว่าไฟล์ล้าสมัยหรือไม่:

  1. เปรียบเทียบขนาดของต้นทางและปลายทาง
  2. เปรียบเทียบการประทับเวลาของต้นทางและปลายทาง
  3. เปรียบเทียบการตรวจสอบแบบคงที่ของต้นทางและปลายทาง

การตรวจสอบเหล่านี้ดำเนินการก่อนถ่ายโอนข้อมูล โดยเฉพาะอย่างยิ่งนี่หมายความว่าการตรวจสอบแบบคงที่แตกต่างจากการตรวจสอบสตรีมซึ่งจะคำนวณในภายหลังขณะถ่ายโอนข้อมูล

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

  • เมื่อใช้--size-onlyจะดำเนินการเพียง 1 รายการ - การประทับเวลาและการตรวจสอบจะถูกละเว้น ไฟล์จะถูกคัดลอกเว้นแต่ว่าขนาดของไฟล์จะเท่ากันทั้งสองด้าน

  • โดยการใช้จะ--ignore-timesไม่มีการดำเนินการ 1, 2 หรือ 3 ไฟล์จะถูกคัดลอกเสมอ

  • โดยการใช้จะใช้--checksum3 นอกเหนือจาก 1 แต่ไม่ได้ใช้ 2 ไฟล์จะถูกคัดลอกเว้นแต่ขนาดและการตรวจสอบจะตรงกัน การตรวจสอบจะคำนวณเมื่อขนาดตรงกันเท่านั้น


1
--checksum คือสิ่งที่ฉันกำลังมองหา ฉันกำลังคัดลอกเอาต์พุตการสร้างที่มีการเปลี่ยนแปลงเวลาสำหรับไฟล์ส่วนใหญ่เท่านั้น การเพิ่ม --checksum หมายความว่าไม่สนใจความแตกต่างของเวลา แต่ตรวจสอบให้แน่ใจว่าเป็นบิตที่เหมือนกันสำหรับบิต เป็นสิ่งที่ฉันคาดหวังว่าจะทำเช่นนั้นขอบคุณสำหรับข้อมูลเพิ่มเติม
Joseph Connolly

50

คุณไม่ทราบว่า rsync สามารถเปรียบเทียบไฟล์ด้วยการตรวจสอบ

--size-onlyหมายความว่า rsync จะข้ามไฟล์ที่มีขนาดตรงกันแม้ว่าการประทับเวลาจะต่างกันก็ตาม ซึ่งหมายความว่าจะซิงโครไนซ์ไฟล์น้อยกว่าลักษณะการทำงานเริ่มต้น มันจะพลาดไฟล์ใด ๆ ที่มีการเปลี่ยนแปลงที่ไม่ส่งผลต่อขนาดไฟล์โดยรวม หากคุณมีบางอย่างที่เปลี่ยนวันที่ในไฟล์โดยไม่ต้องเปลี่ยนไฟล์และคุณไม่ต้องการให้ rsync ใช้เวลามากมายในการตรวจสอบไฟล์เหล่านั้นเพื่อให้พบว่าไฟล์เหล่านั้นไม่มีการเปลี่ยนแปลงนี่คือตัวเลือกที่จะใช้

--ignore-timesหมายความว่า rsync จะตรวจสอบทุกไฟล์แม้ว่าการประทับเวลาและขนาดไฟล์จะตรงกันก็ตาม ซึ่งหมายความว่าจะซิงโครไนซ์ไฟล์มากกว่าพฤติกรรมเริ่มต้น ซึ่งจะรวมการเปลี่ยนแปลงไฟล์แม้ว่าขนาดไฟล์จะเท่ากันและวันที่ / เวลาที่แก้ไขจะถูกรีเซ็ตเป็นค่าเดิม การตรวจสอบข้อมูลทุกไฟล์หมายความว่าต้องอ่านทั้งหมดจากดิสก์ซึ่งอาจทำงานช้า บิวด์ไปป์บางรายการจะรีเซ็ตการประทับเวลาเป็นวันที่เฉพาะเจาะจง (เช่น 1970-01-01) เพื่อให้แน่ใจว่าไฟล์บิลด์สุดท้ายเป็นบิตที่ทำซ้ำได้สำหรับบิตเช่นเมื่อบรรจุลงในไฟล์ tar ที่บันทึกการประทับเวลา


4
"การรีเซ็ตวันที่ / เวลาไม่น่าจะทำได้ในทางปฏิบัติ แต่อาจเกิดขึ้นได้" - ตัวอย่างเช่นเมื่อใช้ซอฟต์แวร์ที่สร้างขึ้นใหม่ในชื่อของการสร้างที่ทำซ้ำได้บังคับให้รีเซ็ตทุกไฟล์เป็น 1970-01-01 แทนที่จะเป็นวันที่และ เวลาของการสร้าง / แก้ไขจริง

10
อันที่จริงฉันคิดว่าคุณต้องใช้อ็อพชัน -c ถ้าคุณต้องการใช้ checksums หากไม่มีมัน - เวลาผ่านไปจะคัดลอกไฟล์ทั้งหมดโดยไม่มีเงื่อนไข
Edward Falk

1
อ็อพชัน -a อาจแทนที่อ็อพชันเหล่านี้ ในกรณีของฉันฉันใช้ --compare-dir = and --size-only และได้ผลลัพธ์ที่ไม่คาดคิด การเปลี่ยน -a เป็น -r ช่วยแก้ปัญหาได้
dbagnara

@dbagnara วันนี้ฉันยืนยันว่า - ขนาดเท่านั้น "อยู่ด้านบนของ" -a หรือ "แทนที่" -a ฉันมีไดรฟ์ที่ไม่ว่าจะด้วยเหตุผลใดก็ตามที่ติดตั้งโดยเวลาปรับเปลี่ยนทั้งหมดเพิ่มขึ้นหนึ่งเดือน Rsync ในการสำรองข้อมูลกำลังคัดลอกทุกไฟล์ (พร้อม -a ON) การเพิ่ม - ขนาดเท่านั้นแก้ไขปัญหาและนำไปสู่ผลลัพธ์ที่ต้องการ (ดังนั้น -a - ขนาดเท่านั้น) ดังนั้นฉันจึงสรุปได้ว่าขนาดเท่านั้นลบล้างที่เก็บถาวร
Tommy

1

ในระบบ Scientific Linux 6.7 หน้าคนใน rsync พูดว่า:

--ignore-times          don't skip files that match size and time

ฉันมีสองไฟล์ที่มีเนื้อหาเหมือนกัน แต่มีวันที่สร้างต่างกัน:

[root@windstorm ~]# ls -ls /tmp/master/usercron /tmp/new/usercron
4 -rwxrwx--- 1 root root 1595 Feb 15 03:45 /tmp/master/usercron
4 -rwxrwx--- 1 root root 1595 Feb 16 04:52 /tmp/new/usercron

[root@windstorm ~]# diff /tmp/master/usercron /tmp/new/usercron
[root@windstorm ~]# md5sum /tmp/master/usercron /tmp/new/usercron
368165347b09204ce25e2fa0f61f3bbd  /tmp/master/usercron
368165347b09204ce25e2fa0f61f3bbd  /tmp/new/usercron

ด้วย--size-onlyไฟล์ทั้งสองถือว่าเหมือนกัน:

[root@windstorm ~]# rsync -v --size-only -n  /tmp/new/usercron /tmp/master/usercron

sent 29 bytes  received 12 bytes  82.00 bytes/sec
total size is 1595  speedup is 38.90 (DRY RUN)

ด้วย--ignore-timesไฟล์ทั้งสองจึงถือว่าแตกต่างกัน:

[root@windstorm ~]# rsync -v --ignore-times -n  /tmp/new/usercron /tmp/master/usercron
usercron

sent 32 bytes  received 15 bytes  94.00 bytes/sec
total size is 1595  speedup is 33.94 (DRY RUN)

จึงดูเหมือน--ignore-timesไม่มีผลใด ๆ เลย


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