คำแนะนำในการใช้ ire_and_curses tar c <dir>มีปัญหาบางประการ:
- tar ประมวลผลรายการไดเร็กทอรีตามลำดับที่เก็บไว้ในระบบไฟล์และไม่มีวิธีใดที่จะเปลี่ยนลำดับนี้ สิ่งนี้สามารถให้ผลลัพธ์ที่แตกต่างไปจากเดิมอย่างสิ้นเชิงหากคุณมีไดเร็กทอรี "เดียวกัน" ในที่ต่างๆและฉันรู้วิธีแก้ไขปัญหานี้ไม่ได้ (tar ไม่สามารถ "เรียงลำดับ" ไฟล์อินพุตตามลำดับที่เจาะจงได้)
- ฉันมักจะสนใจว่าหมายเลข groupid และ ownerid เหมือนกันหรือไม่ไม่จำเป็นว่าการแสดงสตริงของกลุ่ม / เจ้าของจะเหมือนกัน สิ่งนี้สอดคล้องกับสิ่งที่ทำตัวอย่างเช่น
rsync -a --deleteมันซิงโครไนซ์แทบทุกอย่าง (ลบ xattrs และ acls) แต่จะซิงค์เจ้าของและกลุ่มตาม ID ไม่ใช่การแสดงสตริง ดังนั้นหากคุณซิงค์กับระบบอื่นที่ไม่จำเป็นต้องมีผู้ใช้ / กลุ่มเดียวกันคุณควรเพิ่ม--numeric-ownerแฟล็กลงใน tar
- tar จะรวมชื่อไฟล์ของไดเร็กทอรีที่คุณกำลังตรวจสอบตัวเองเป็นเพียงสิ่งที่ควรระวัง
ตราบเท่าที่ไม่มีการแก้ไขสำหรับปัญหาแรก (หรือเว้นแต่คุณแน่ใจว่าไม่มีผลกับคุณ) ฉันจะไม่ใช้วิธีนี้
findการแก้ปัญหาตามที่เสนอข้างต้นนี้ยังไม่ดีเพราะพวกเขารวมถึงแฟ้มไม่ไดเรกทอรีซึ่งกลายเป็นปัญหาถ้าคุณ Checksumming ควรเก็บไว้ในใจไดเรกทอรีว่าง
สุดท้ายโซลูชันที่แนะนำส่วนใหญ่จะไม่เรียงลำดับอย่างสม่ำเสมอเนื่องจากการเปรียบเทียบอาจแตกต่างกันในระบบต่างๆ
นี่คือวิธีแก้ปัญหาที่ฉันคิดขึ้น:
dir=<mydir>; (find "$dir" -type f -exec md5sum {} +; find "$dir" -type d) | LC_ALL=C sort | md5sum
หมายเหตุเกี่ยวกับโซลูชันนี้:
LC_ALL=Cคือเพื่อให้แน่ใจเพื่อเรียงลำดับความน่าเชื่อถือในระบบ
- สิ่งนี้ไม่ได้แยกความแตกต่างระหว่างไดเร็กทอรี "named \ nwithanewline" และ 2 ไดเร็กทอรี "named" และ "withanewline" แต่โอกาสที่จะเกิดขึ้นดูเหมือนไม่น่าเป็นไปได้มาก หนึ่งมักจะแก้ไขปัญหานี้ด้วย
-print0แฟล็กfindแต่เนื่องจากมีสิ่งอื่นเกิดขึ้นที่นี่ฉันจึงเห็นโซลูชันที่จะทำให้คำสั่งซับซ้อนมากขึ้นเท่านั้นจึงคุ้มค่า
PS: หนึ่งในระบบของฉันใช้ busybox แบบ จำกัดfindซึ่งไม่รองรับ-execหรือ-print0แฟล็กและยังต่อท้าย '/' เพื่อแสดงถึงไดเร็กทอรีในขณะที่ดูเหมือนว่า findutils ไม่พบดังนั้นสำหรับเครื่องนี้ฉันต้องเรียกใช้:
dir=<mydir>; (find "$dir" -type f | while read f; do md5sum "$f"; done; find "$dir" -type d | sed 's#/$##') | LC_ALL=C sort | md5sum
โชคดีที่ฉันไม่มีไฟล์ / ไดเรกทอรีที่มีบรรทัดใหม่ในชื่อดังนั้นนี่ไม่ใช่ปัญหาในระบบนั้น