Şaşırtıcı bir şekilde, 6 yıl içinde hiçbir cevap -i
seçeneği kullanmıyor ya da güzel çıktılar veriyor.
TLDR - Sadece bana komutları göster
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 /'
Çıktıyı anlamak
İşte çıktının bir örneği:
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
Her satırın ilk karakterine dikkat edin:
L
/ R
demek ki, / dir dosyası yalnızca L
eft veya R
ight dir'de görünür .
X
dosya her iki tarafta görünür ama (. bu durumda bir sonraki 11 karakter size daha fazla bilgi vermek aynı olmadığı anlamına gelir s
, t
ve p
farklılıkları tasvir s ize, t ime ve p - deneyin daha fazla bilgi için sırasıyla ermissions man rsync
ve aramak --itemize-changes
) .
Kullanmak isteyebileceğiniz ilave seçenekler
Dosyaların sahibini / grubunu / izinlerini de karşılaştırmak istiyorsanız, sırasıyla -o
/ -g
/ seçeneklerini ekleyin -p
. Son olarak, varsayılan olarak rsync'in aynı adı, zamanı ve boyutu varsa, iki dosyayı aynı şekilde değerlendirdiğini unutmayın. Bu son derece hızlıdır ve çoğu zaman fazlasıyla yeterlidir ancak% 100 olmasını istiyorsanız -c
, aynı zamanda, aynı ad, zaman ve boyuttaki dosyaların içeriğini de karşılaştırmayı unutmayın.
TLDR - Sadece bana aramak için bir komut dosyası verin
İşte burada. Buna böyle çağır
diff-dirs Left_Dir Right_Dir [options]
"Kullanmak isteyebileceğiniz ilave seçenekler" bölümünde yukarıda belirtilen tüm seçenekler burada da geçerlidir.
#!/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 /'
O nasıl çalışır?
Buna rsync diyoruz:
rsync -rin ...
İki dizin arasındaki farklar hakkında bilgi içeren her dosya için bir çıktı satırı yazdırmasını rsync'e -i
( --itemize-changes
) kullanırız . -n
Rsync'in normal davranışını bastırmamız gerekir (bu, dosyaları kopyalayarak / silerek iki diziyi senkronize etmeye çalışmaktır). ayrıca -r
tüm dosyalar / alt dizinler için özyinelemeli çalışmamız gerekiyor .
Rsync'i üç kere ararız:
1. çağrı : Dir_B'de bulunmayan dosyaları yazdırır. Her --ignore-existing
iki tarafta da bulunan dosyaları yoksaymak için kullanmamız gerekiyor .
rsync -rin --ignore-existing $DIR_A/ $DIR_B/
2. çağrı : Daha önce olduğu gibi fakat DIR_A / DIR_B sırasını değiştiriyoruz.
3. çağrı : Sonunda --existing
sadece her iki dizde de görünen dosyaları kontrol etmek için kullanıyoruz .
rsync -rin --existing $DIR_A/ $DIR_B/