Überraschenderweise nutzt keine Antwort in 6 Jahren die -i
Option oder gibt eine gute Ausgabe aus.
TLDR - Zeigen Sie mir einfach die Befehle
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 /'
Die Ausgabe verstehen
Hier ist ein Beispiel für die Ausgabe:
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
Beachten Sie das erste Zeichen jeder Zeile:
L
/ R
bedeutet, dass die Datei / dir nur in der L
EFT- oder R
EIGHT-Richtung angezeigt wird.
X
bedeutet , dass die Datei auf beiden Seiten erscheint , ist aber nicht das gleiche (in diesem Fall die nächsten 11 Zeichen geben Ihnen weitere Informationen. s
, t
und p
zeigen Unterschiede in s ize, t ime und p ermissions jeweils - für weitere Informationen versuchen man rsync
und suchen --itemize-changes
) .
Zusätzliche Optionen, die Sie möglicherweise verwenden möchten
Wenn Sie auch den Eigentümer / die Gruppe / die Berechtigungen der Dateien vergleichen möchten, fügen Sie die Optionen -o
/ -g
/ hinzu -p
. Beachten Sie schließlich, dass rsync standardmäßig zwei Dateien als gleich ansieht, wenn sie denselben Namen, dieselbe Zeit und dieselbe Größe haben. Dies ist extrem schnell und in den meisten Fällen mehr als ausreichend. Wenn Sie jedoch 100% sicher sein möchten, -c
vergleichen Sie auch den Inhalt von Dateien mit demselben Namen, derselben Zeit und Größe.
TLDR - Gib mir einfach ein Skript zum Anrufen
Hier ist es. Nenne es so
diff-dirs Left_Dir Right_Dir [options]
Alle oben im Abschnitt "Zusätzliche Optionen, die Sie möglicherweise verwenden möchten" genannten Optionen gelten auch hier.
#!/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 /'
Wie funktioniert es?
Wir rufen Rsync folgendermaßen auf:
rsync -rin ...
Wir verwenden -i
( --itemize-changes
), um rsync anzuweisen, eine Ausgabezeile für jede Datei zu drucken, die Informationen über Unterschiede zwischen den beiden Verzeichnissen enthält. Wir müssen -n
das normale Verhalten von rsync unterdrücken (dh versuchen, die beiden Verzeichnisse durch Kopieren / Löschen von Dateien zu synchronisieren). Wir müssen auch -r
rekursiv für alle Dateien / Unterverzeichnisse arbeiten.
Wir rufen rsync dreimal auf:
1. Aufruf : Druckt Dateien, die in Dir_B nicht existieren. Wir müssen verwenden --ignore-existing
, um Dateien zu ignorieren, die auf beiden Seiten existieren.
rsync -rin --ignore-existing $DIR_A/ $DIR_B/
2. Aufruf : Genau wie zuvor, aber wir tauschen die Reihenfolge von DIR_A / DIR_B.
3. Aufruf : Schließlich --existing
prüfen wir nur die Dateien, die in beiden Verzeichnissen erscheinen.
rsync -rin --existing $DIR_A/ $DIR_B/