Wenn ich die Unterschiede zwischen zwei Verzeichnisbäumen finden möchte, führe ich normalerweise einfach Folgendes aus:
diff -r dir1/ dir2/
Dies gibt genau die Unterschiede zwischen den entsprechenden Dateien aus. Ich bin daran interessiert, nur eine Liste der entsprechenden Dateien zu erhalten, deren Inhalt unterschiedlich ist. Ich nahm an, dass dies einfach eine Frage der Übergabe einer Befehlszeilenoption sein würde diff
, aber ich konnte auf der Manpage nichts finden.
Irgendwelche Vorschläge?
dircmp
Befehl unter Unix (nicht Linux)Antworten:
Sie sagten Linux, also haben Sie Glück (zumindest sollte es verfügbar sein, nicht sicher, wann es hinzugefügt wurde):
Sollte tun, was Sie brauchen.
Wenn Sie auch Unterschiede für Dateien sehen möchten, die möglicherweise in keinem der beiden Verzeichnisse vorhanden sind:
quelle
diff -qr dir1/ dir2/
und meine erweiterte Version zudiff -qr dir1/ dir2/ | grep ' differ'
--brief
die Verknüpfung geändert-q
.--brief
.-brief
wird interpretiert als-b -r -i -e -f
, mit anderen Worten als eine Reihe von Flags, nicht als eine einzelne Option.Der Befehl, den ich benutze, ist:
Es ist genau das gleiche wie bei Marks :) Aber seine Antwort hat mich gestört, da es verschiedene Arten von Flaggen verwendet und ich zweimal hinschauen musste. Mit Marks ausführlicheren Flags wäre es:
Ich entschuldige mich für die Veröffentlichung, wenn die andere Antwort vollkommen akzeptabel ist. Konnte mich nicht aufhalten ... daran zu arbeiten, weniger pedantisch zu sein.
quelle
q
? Ist es eine Abkürzung für etwas? Ich kann keine Logik hinter dem findenq
.q
ist fürquiet
, was im Allgemeinen weniger ausführlich bedeutet.Ich verwende es gerne
git diff --no-index dir1/ dir2/
, weil es die Farbunterschiede anzeigen kann (wenn Sie diese Option in Ihrer Git-Konfiguration festgelegt haben) und weil es alle Unterschiede in einer Ausgabe mit langen Seiten mit "weniger" anzeigt.quelle
--no-index
unter stackoverflow.com/a/1792477/473390 weitere hinzufügen . Ich habe die Antwort von @ alan-porter aktualisiert.--name-status
zur Befehlszeile hinzufügen , es nur die Dateinamenliste mit "M / A / D" -Flaggen für den Status Geändert / Hinzugefügt / Gelöscht anzeigt.Diese beiden Befehle erfüllen im Grunde die Anforderungen:
Die Wahl zwischen ihnen hängt von der Position von dir1 und dir2 ab:
Wenn sich die Verzeichnisse auf zwei separaten Laufwerken befinden, übertrifft diff rsync. Wenn sich die beiden verglichenen Verzeichnisse jedoch auf demselben Laufwerk befinden, ist rsync schneller. Dies liegt daran, dass diff beide Verzeichnisse parallel fast gleich stark belastet und so die Belastung der beiden Laufwerke maximiert.
rsync berechnet Prüfsummen in großen Blöcken, bevor sie tatsächlich verglichen werden. Dies gruppiert die E / A-Vorgänge in großen Blöcken und führt zu einer effizienteren Verarbeitung, wenn Dinge auf einem einzelnen Laufwerk stattfinden.
quelle
rsync --options /usr /bin /var /sbin /lib /old_root
effektiv aktuellen Root vergleichen/
(durch alle subdirs darin Angabe) und/old_root
(enthält zum Beispiel eine ältere Sicherung/
), die etwas ist ,diff -r
kann nicht tun. Und wenn Sie feststellen , dass Dateien mit gleicher Größe, Berechtigungen übernehmen und Zeitstempel haben wahrscheinlich nicht geändert, Weglassen--checksum
werden Sie mit extrem schnell (wenn auch nicht so durch) Kontrolle , welche Dateien geändert haben könnten.--delete
mitrsync
?--dry-run
Flag) wird nichts wirklich gelöscht,rsync
sondern nur gedruckt, welche Dateien sich in dir1, aber nicht in dir2 befinden--dry-run
immer an erster Stelle zu stehen, um es nicht versehentlich zu vergessen.Meld ist auch ein großartiges Tool zum Vergleichen von zwei Verzeichnissen:
meld dir1/ dir2/
Meld bietet viele Optionen zum Vergleichen von Dateien oder Verzeichnissen. Wenn sich zwei Dateien unterscheiden, können Sie leicht in den Dateivergleichsmodus wechseln und die genauen Unterschiede erkennen.
quelle
meld
das schrecklich träge wird, wenn es in großen Verzeichnissen verwendet wird. Gibt es etwas, das große Verzeichnisse besser handhabt?find dir1 dir2 | cut -d/ -f2- | sort | uniq --unique
meld <(find dir1 -ls ) <(find dir2 -ls)
funktioniert das ziemlich gut, wenn man die Bash-Prozess-Substitution verwendet. (zsh=(command)
funktioniert noch besser.)Channel-Landsmann 'Billings' (von Freenode / # Centos Ruhm) teilte mir seine Methode mit:
Das Einfügen des endgültigen Verzeichnis-Schrägstrichs spielt keine Rolle.
Außerdem scheint die
-u
Option bei einigen älteren / Server-Versionen von diff nicht verfügbar zu sein.Der Unterschied in den Unterschieden:
quelle
--new-file/-N
was diff dazu veranlasst, fehlende Dateien als leer--text/-a
zu betrachten und alle Binäreingaben als Text zu betrachten. Ich sehe die Vorteile für diesen speziellen Anwendungsfall nicht.Diffoscope ist ein großartiges befehlszeilenbasiertes Verzeichnisdiff-Tool.
Mir gefällt besonders, dass es sich in Dateien unterscheiden kann:
Hier erfahren Sie nicht nur, welche Dateien sich unterscheiden, sondern auch, wie sie sich unterscheiden.
quelle
Verwenden Sie diesen Befehl, um diff zu finden:
-r unterscheidet auch alle Unterverzeichnisse. -q weist diff an, nur dann zu melden, wenn sich die Dateien unterscheiden.
--brief zeigt die Dateien an, die im Verzeichnis vorhanden sind.
Oder aber
Wir können Meld verwenden, das im grafischen Fenster anzeigt, wie leicht der Unterschied zu finden ist.
quelle
--brief
und-q
sind die gleiche Option. Ihre Aussage lässt es so klingen, als wären sie unterschiedlich, aber sie sind es nicht.Sie können auch verwendet werden
Rsync
undfind
. Fürfind
:Dateien mit demselben Namen und in denselben Unterordnern, jedoch mit unterschiedlichem Inhalt, werden jedoch nicht in den Listen angezeigt.
Wenn Sie ein Fan von GUI sind, können Sie die Meldung überprüfen , die @Alexander erwähnt hat. Es funktioniert gut in Windows und Linux.
quelle
Um Unterschiede zwischen dirA und dirB zu melden und gleichzeitig zu aktualisieren / zu synchronisieren.
rsync -auv <dirA> <dirB>
quelle