สำหรับรุ่น 3.3 หรือสูงกว่าของdiff
คุณควรใช้--no-dereference
ตัวเลือกที่อธิบายไว้ในคำตอบของพีทฮาร์ลาน
น่าเสียดายที่เวอร์ชันเก่ากว่าdiff
ไม่สนับสนุนการละเว้น symlink :
ไฟล์บางไฟล์ไม่ใช่ไดเรกทอรีหรือไฟล์ปกติ: เป็นไฟล์ที่ผิดปกติเช่นลิงก์สัญลักษณ์ไฟล์พิเศษของอุปกรณ์ชื่อไปป์และซ็อกเก็ต ขณะนี้diff
ถือว่าลิงก์สัญลักษณ์เช่นไฟล์ปกติ มันจะถือว่าไฟล์พิเศษอื่น ๆ เช่นไฟล์ปกติหากมีการระบุไว้ที่ระดับบนสุด แต่เพียงรายงานสถานะของพวกเขาเมื่อเปรียบเทียบไดเรกทอรี ซึ่งหมายความว่าpatch
ไม่สามารถแสดงการเปลี่ยนแปลงของไฟล์ดังกล่าวได้ ตัวอย่างเช่นหากคุณเปลี่ยนไฟล์ที่ลิงก์สัญลักษณ์ชี้ไปจะdiff
แสดงผลลัพธ์ที่แตกต่างระหว่างสองไฟล์แทนการเปลี่ยนเป็นลิงก์สัญลักษณ์
diff
ควรรายงานการเปลี่ยนแปลงไฟล์พิเศษเป็นทางเลือกและpatch
ควรขยายเพื่อทำความเข้าใจกับส่วนขยายเหล่านี้
หากสิ่งที่คุณต้องการคือการยืนยัน rsync (และอาจแก้ไขสิ่งที่ขาดหายไป) จากนั้นคุณสามารถเรียกใช้คำสั่ง rsync ได้อีกครั้ง หากคุณไม่ต้องการทำเช่นนั้นให้ตรวจสอบการรวมไดเรกทอรีอาจเพียงพอ
หากคุณต้องการทำสิ่งนี้จริงๆdiff
คุณสามารถใช้find
ข้ามการเชื่อมโยงและเรียกใช้แต่ละไฟล์แยกกัน ส่งผ่านไดเรกทอรีaและb ของคุณเป็นอาร์กิวเมนต์:
#!/bin/bash
# Skip files in $1 which are symlinks
for f in `find $1/* ! -type l`
do
# Suppress details of differences
diff -rq $f $2/${f##*/}
done
หรือเป็นหนึ่งซับ:
for f in `find a/* ! -type l`;do diff -rq $f b/${f##*/};done
นี้จะระบุไฟล์ที่แตกต่างกันในเนื้อหาหรือไฟล์ที่อยู่ในแต่ไม่ได้อยู่ในข
โปรดทราบว่า:
- เนื่องจากเรากำลังข้าม symlinks ทั้งหมดนี้จะไม่แจ้งให้ทราบถ้าชื่อ symlink ไม่ได้อยู่ในข หากคุณจำเป็นที่คุณจะต้องเป็นครั้งที่สองหาผ่านเพื่อแจ้ง symlinks ทั้งหมดแล้วอย่างชัดเจนตรวจสอบสำหรับการดำรงอยู่ของพวกเขาในข
- ไฟล์พิเศษในขจะไม่ถูกระบุตั้งแต่รายการที่มีการสร้างขึ้นมาจากเนื้อหาของ นี่อาจไม่ใช่ปัญหาสำหรับสถานการณ์ของคุณ
rsync