น่าแปลกที่ไม่มีคำตอบใน 6 ปีที่ใช้-i
ตัวเลือกหรือให้ผลลัพธ์ที่ดีดังนั้นที่นี่ฉันจะไป:
TLDR - เพียงแค่แสดงคำสั่ง
rsync -rin --ignore-existing "$LEFT_DIR"/ "$RIGHT_DIR"/|sed -e 's/^[^ ]* /L /'
rsync -rin --ignore-existing "$RIGHT_DIR"/ "$LEFT_DIR"/|sed -e 's/^[^ ]* /R /'
rsync -rin --existing "$LEFT_DIR"/ "$RIGHT_DIR"/|sed -e 's/^/X /'
ทำความเข้าใจเกี่ยวกับผลลัพธ์
นี่คือตัวอย่างของผลลัพธ์:
L file-only-in-Left-dir
R file-only-in-right-dir
X >f.st...... file-with-dif-size-and-time
X .f...p..... file-with-dif-perms
บันทึกอักขระตัวแรกของทุกบรรทัด:
L
/ R
หมายความว่าไฟล์ / dir ปรากฏที่L
eft หรือR
ight dir เท่านั้น
X
หมายความว่าไฟล์จะปรากฏบนทั้งสองข้าง แต่ไม่เหมือนกัน (ซึ่งในกรณีที่ 11 ตัวต่อไปให้ข้อมูลเพิ่มเติม. s
, t
และp
แสดงให้เห็นถึงความแตกต่างในs ize, เสื้อ IME และพี ermissions ลำดับ - สำหรับข้อมูลเพิ่มเติมลองman rsync
และค้นหา--itemize-changes
) .
ตัวเลือกพิเศษที่คุณอาจต้องการใช้
หากคุณต้องการเปรียบเทียบเจ้าของ / กลุ่ม / สิทธิ์ของไฟล์ให้เพิ่มตัวเลือก-o
/ -g
/ -p
ตามลำดับ สุดท้ายโปรดทราบว่าโดยค่าเริ่มต้น rsync จะพิจารณาไฟล์สองไฟล์เหมือนกันหากไฟล์นั้นมีชื่อเวลาและขนาดเท่ากัน สิ่งนี้เร็วมากและส่วนใหญ่เกินพอ แต่ถ้าคุณต้องการให้แน่ใจ 100% ให้เพิ่ม-c
เพื่อเปรียบเทียบเนื้อหาของไฟล์ด้วยชื่อเวลาและขนาดเดียวกัน
TLDR - เพียงแค่ให้สคริปต์โทรหาฉัน
นี่มันคือ เรียกว่าเป็นแบบนี้
diff-dirs Left_Dir Right_Dir [options]
ตัวเลือกทั้งหมดที่กล่าวถึงข้างต้นในหัวข้อ "ตัวเลือกเพิ่มเติมที่คุณอาจต้องการใช้" ก็ใช้ที่นี่เช่นกัน
#!/bin/bash
# Compare two directories using rsync and print the differences
# CAUTION: options MUST appear after the directories
#
# SYNTAX
#---------
# diff-dirs Left_Dir Right_Dir [options]
#
# EXAMPLE OF OUTPUT
#------------------
# L file-only-in-Left-dir
# R file-only-in-right-dir
# X >f.st...... file-with-dif-size-and-time
# X .f...p..... file-with-dif-perms
#
# L / R mean that the file/dir appears only at the `L`eft or `R`ight dir.
#
# X means that a file appears on both sides but is not the same (in which
# case the next 11 characters give you more info. In most cases knowing
# that s,t,T and p depict differences in Size, Time and Permissions
# is enough but `man rsync` has more info
# (look at the --itemize-changes option)
#
# OPTIONS
#---------
# All options are passed to rsync. Here are the most useful for the purpose
# of directory comparisons:
#
# -c will force comparison of file contents (otherwise only
# time & size is compared which is much faster)
#
# -p/-o/-g will force comparison of permissions/owner/group
if [[ -z $2 ]] ; then
echo "USAGE: $0 dir1 dir2 [optional rsync arguments]"
exit 1
fi
set -e
LEFT_DIR=$1; shift
RIGHT_DIR=$1; shift
OPTIONS="$*"
# Files that don't exist in Right_Dir
rsync $OPTIONS -rin --ignore-existing "$LEFT_DIR"/ "$RIGHT_DIR"/|sed -e 's/^[^ ]* /L /'
# Files that don't exist in Left_Dir
rsync $OPTIONS -rin --ignore-existing "$RIGHT_DIR"/ "$LEFT_DIR"/|sed -e 's/^[^ ]* /R /'
# Files that exist in both dirs but have differences
rsync $OPTIONS -rin --existing "$LEFT_DIR"/ "$RIGHT_DIR"/|sed -e 's/^/X /'
มันทำงานยังไง?
เรากำลังเรียก rsync เช่นนี้:
rsync -rin ...
เราใช้-i
( --itemize-changes
) เพื่อบอก rsync ให้พิมพ์ผลลัพธ์หนึ่งบรรทัดสำหรับทุกไฟล์ที่มีข้อมูลเกี่ยวกับความแตกต่างระหว่างสองไดเรกทอรี เราจำเป็นต้อง-n
หยุดพฤติกรรมปกติของ rsync (ซึ่งพยายามซิงค์ทั้งสอง dirs โดยการคัดลอก / ลบไฟล์) นอกจากนี้เรายังต้อง-r
ทำงานซ้ำสำหรับไฟล์ / ย่อยทั้งหมด
เราเรียก rsync สามครั้ง:
การโทรครั้งที่ 1 : พิมพ์ไฟล์ที่ไม่มีอยู่ใน Dir_B เราจำเป็นต้องใช้--ignore-existing
เพื่อละเว้นไฟล์ที่มีอยู่ทั้งสองด้าน
rsync -rin --ignore-existing $DIR_A/ $DIR_B/
การโทรครั้งที่สอง : เหมือนเดิมก่อนหน้านี้ แต่เราสลับคำสั่งของ DIR_A / DIR_B
การโทรครั้งที่ 3 : ในที่สุดเราใช้--existing
เพื่อตรวจสอบไฟล์ที่ปรากฏในทั้งคู่
rsync -rin --existing $DIR_A/ $DIR_B/