Ist es möglich, zwei Verzeichnisse mit rsync zu vergleichen und nur die Unterschiede auszudrucken? Es gibt eine Trockenlaufoption, aber wenn ich die Ausführlichkeit auf ein bestimmtes Maß erhöhe, wird jede verglichene Datei angezeigt.
ls -alR
und diff
ist hier keine Option, da es Hardlinks in der Quelle gibt, die jede Zeile anders machen. (Natürlich könnte ich diese Spalte mit Perl löschen.)
directory
rsync
file-comparison
chris
quelle
quelle
Antworten:
Sie müssen wahrscheinlich
rsync -avun --delete
in beide Richtungen laufen .Aber was versuchst du eigentlich zu erreichen?
Update :
rsync -avun --delete $TARGET $SOURCE |grep "^deleting "
Sie erhalten eine Liste der Dateien, die im Zielverzeichnis nicht vorhanden sind."grep delet", da jede Zeile Folgendes ausgibt : delet ing ..file ..
rsync -avun $SOURCE $TARGET
Sie erhalten eine Liste mit "verschiedenen" Dateien (einschließlich neuer Dateien).quelle
Um die Antwort von Nils zu ergänzen (für alle, die über Google darauf stoßen), werden standardmäßig
rsync
nur die Dateigrößen und Änderungszeiten verglichen , um festzustellen , ob es Unterschiede gibt. (Wenn diese unterschiedlich sind, bewirkt dies mehr, aber wenn sie gleich sind, hört es dort auf.)Wenn Sie aktuelle Datei vergleichen wollen Inhalte , auch für Dateien , die die gleiche Größe und Zeitpunkt der letzten Änderung haben, fügen Sie die Flagge
-c
zu sagen ,rsync
die Dateien mit einer Prüfsumme zu vergleichen.(Die
-u
Option weist rsync an, Dateien zu ignorieren, die neuer sind$TARGET
als on$SOURCE
, was Sie wahrscheinlich nicht möchten, wenn Sie Inhalte vergleichen.)quelle
--no-group --no-owner --no-perms --no-times
diese je nach Ihren Anforderungen möglicherweise hinzufügen oder kombinieren.-a
anstatt-a
zBrsync -rlDcnv --delete $SOURCE $TARGET
--delete
zur Liste hinzufügen nur existierende Dateien in$TARGET
Nur für diejenigen, die weniger vertraut sind mit
rsync
:-n
: Wichtigstes Bit - nichts ändern;-rc
: nur den Inhalt vergleichen (sonst verwenden-ac
);-v
: Liste der Dateien)--delete
: Suchen Sie nach einem symmetrischen, nicht nach einem unidirektionalen Unterschied./
bedeutet "In das Verzeichnis schauen und dessen Inhalt mit dem Ziel vergleichen".PS. Ich weiß, es ist eine schreckliche PS - aber es wurde in der Tat in Eile hinzugefügt. Trotzdem, ich wette, man kann dies nützlich finden.
PPS. Alternativ könnte man auch tun
Wenn die Dateinamen keine Zeilenumbrüche enthalten, können wir beide
*.md5
Dateien unddiff
diese sortieren . (Dies funktioniert jedoch nur für Dateien. Das heißt, ein leeres Verzeichnis auf beiden Seiten wird nicht erkannt.)quelle
Überraschenderweise nutzt keine Antwort in 6 Jahren die
-i
Option oder gibt eine gute Ausgabe aus.TLDR - Zeigen Sie mir einfach die Befehle
Die Ausgabe verstehen
Hier ist ein Beispiel für die Ausgabe:
Beachten Sie das erste Zeichen jeder Zeile:
L
/R
bedeutet, dass die Datei / dir nur in derL
EFT- oderR
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
undp
zeigen Unterschiede in s ize, t ime und p ermissions jeweils - für weitere Informationen versuchenman 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
Alle oben im Abschnitt "Zusätzliche Optionen, die Sie möglicherweise verwenden möchten" genannten Optionen gelten auch hier.
Wie funktioniert es?
Wir rufen Rsync folgendermaßen auf:
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.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.quelle
Ich verstehe aus Ihrer Frage, dass Sie diff nicht für ls verwenden möchten , aber Sie können diff auch rekursiv für Verzeichnisse verwenden:
quelle
Ich brauchte ein paar Versuche, um das zum Laufen zu bringen. Nils 'Antwort erfordert, dass sie
$TARGET
mit einem Trailing endet/
, wie es durch ジ ジ ー explained erklärt wird.Hier ist eine Version, die das Trailing explizit hinzufügt
/
:Dies gibt die Liste der Dateien an, die unterhalb des
${SOURCE}
Verzeichnisses existieren, jedoch nicht unterhalb des${TARGET}
Verzeichnisses.Ich benutze
sed
hier, um die führendendeleting
Zeilen aus den Ausgabezeilen zu entfernen und nur diese Zeilen zu drucken.Ich verwende diese
rsync
Option nicht,-c
da der Vergleich von Dateiinhalten in meinen Anwendungsfällen sehr viel langsamer wäre und auch in diesen Fällen der Vergleich nur von Dateigrößen und Änderungszeiten ausreichend erscheint. Ich habe keinen Grund zu der Annahme, dass meine Computer Probleme mit dem Zeitversatz haben oder dass sich die Zeitstempel auf böswillige Weise geändert haben. Das Ergebnis von-c
kann nicht die Entscheidung zum Löschen einer Datei ändern, sondern nur die Entscheidung zum Aktualisieren oder Aufbewahren einer Datei.Ich benutze auch
-u
und-a
(nicht-r
), so dass ich später den Zeilenbefehl wieder verwenden und verändern ausgewählte Verzeichnisse und Dateien aus kopieren${SOURCE}
zu${TARGET}
, wie folgt aus :quelle
Ich habe eine andere Idee, dies zu tun:
Sie können "FILEDETAIL ::" mit der Ausgabe des Befehls abgleichen. Sie können auch die Zeichenfolge "FILEDETAIL ::" ändern. Das "% n" ist der Dateiname.
-r Weist rsync an, Verzeichnisse rekursiv zu kopieren.
-n Damit führt rsync einen Testlauf durch, bei dem keine Änderungen vorgenommen werden.
quelle