Anehnya tidak ada jawaban dalam 6 tahun menggunakan -i
opsi atau memberikan output yang bagus jadi di sini saya akan pergi:
TLDR - Tunjukkan saja padaku perintahnya
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 /'
Memahami output
Berikut ini contoh outputnya:
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
Perhatikan karakter pertama dari setiap baris:
L
/ R
Berarti file / dir hanya muncul di L
eft atau R
ight dir.
X
berarti bahwa file tersebut muncul di kedua sisi, tapi tidak sama (dalam hal ini 11 karakter berikutnya memberikan info lebih lanjut. s
, t
dan p
menggambarkan perbedaan s ize, t ime dan p ermissions masing - untuk info lebih lanjut mencoba man rsync
dan mencari --itemize-changes
) .
Opsi tambahan yang mungkin ingin Anda gunakan
Jika Anda ingin juga membandingkan pemilik / grup / izin file tambahkan opsi -o
/ -g
/ -p
masing-masing. Akhirnya perhatikan bahwa secara default rsync menganggap dua file sama jika mereka memiliki nama, waktu, dan ukuran yang sama. Ini sangat cepat dan sebagian besar kali lebih dari cukup tetapi jika Anda ingin 100% yakin tambahkan -c
juga membandingkan konten file dengan nama, waktu & ukuran yang sama.
TLDR - Beri aku skrip untuk dihubungi
Ini dia. Sebut saja seperti ini
diff-dirs Left_Dir Right_Dir [options]
Semua opsi yang disebutkan di atas di bagian "Opsi tambahan yang ingin Anda gunakan" juga berlaku di sini.
#!/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 /'
Bagaimana cara kerjanya?
Kami memanggil rsync seperti ini:
rsync -rin ...
Kami menggunakan -i
( --itemize-changes
) untuk memberitahu rsync untuk mencetak satu baris output untuk setiap file yang berisi informasi tentang perbedaan antara dua direktori. Kita perlu -n
menekan perilaku normal rsync (yaitu mencoba menyinkronkan kedua dir dengan menyalin / menghapus file). kita juga perlu -r
bekerja secara rekursif untuk semua file / sub-dir.
Kami memanggil rsync tiga kali:
Panggilan pertama : cetak file yang tidak ada di Dir_B. Kita perlu menggunakan --ignore-existing
untuk mengabaikan file yang ada di kedua sisi.
rsync -rin --ignore-existing $DIR_A/ $DIR_B/
Panggilan kedua : Persis seperti sebelumnya, tetapi kami menukar urutan DIR_A / DIR_B.
Panggilan ketiga : Akhirnya kami --existing
hanya menggunakan untuk memeriksa file yang muncul di kedua dir.
rsync -rin --existing $DIR_A/ $DIR_B/