it-swarm.com.de

Wie kann ich bei zwei Verzeichnisbäumen herausfinden, welche Dateien unterschiedlich sind?

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 aus, worin die Unterschiede zwischen den entsprechenden Dateien bestehen. Ich möchte nur eine Liste der entsprechenden Dateien erhalten, deren Inhalt sich unterscheidet. Ich ging davon aus, dass dies lediglich eine Übergabe einer Befehlszeilenoption an diff bedeutet, konnte aber auf der Manpage nichts finden.

Irgendwelche Vorschläge?

717

Sie sagten Linux, also haben Sie Glück (zumindest sollte es verfügbar sein, nicht sicher, wann es hinzugefügt wurde):

diff --brief --recursive dir1/ dir2/ # GNU long options
diff -qr dir1/ dir2/ # common short options

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:

diff --brief --recursive --new-file dir1/ dir2/ # GNU long options
diff -qrN dir1/ dir2/ # common short options
1029
Mark Loeser

Der Befehl, den ich benutze, ist:

diff -qr dir1/ dir2/

Es ist genau das gleiche wie bei Markus :) Aber seine Antwort hat mich gestört, da es verschiedene Typen von Flags verwendet, und es hat mich dazu gebracht, zweimal hinzuschauen. Mit Marks ausführlicheren Flags wäre es:

diff  --brief --recursive dir1/ dir2/

Ich entschuldige mich für das Posten, wenn die andere Antwort vollkommen akzeptabel ist. Konnte mich nicht aufhalten ... daran zu arbeiten, weniger pedantisch zu sein.

280
FPC

Ich verwende gerne git diff --no-index dir1/ dir2/, weil es die Unterschiede in der Farbe anzeigen kann (wenn Sie diese Option in Ihrer Git-Konfiguration festgelegt haben) und weil es alle Unterschiede in einer Ausgabe mit langen Seiten mit "less" anzeigt.

92
Alan Porter

Diese beiden Befehle erfüllen im Grunde genommen die Anforderungen:

diff --brief --recursive --no-dereference --new-file --no-ignore-file-name-case /dir1 /dir2 > dirdiff_1.txt

rsync --recursive --delete --links --checksum --verbose --dry-run /dir1/ /dir2/ > dirdiff_2.txt

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. Das liegt daran, dass diff beide Verzeichnisse fast gleichermaßen parallel belastet, wodurch die Belastung der beiden Laufwerke maximiert wird.

rsync berechnet Prüfsummen in großen Blöcken, bevor sie tatsächlich verglichen werden. Das gruppiert die I/O-Operationen in großen Blöcken und führt zu einer effizienteren Verarbeitung, wenn die Dinge auf einem einzelnen Laufwerk stattfinden.

31
CodeBug

Meld ist auch ein großartiges Tool zum Vergleichen von zwei Verzeichnissen:

meld dir1/ dir2/

Meld hat viele Optionen zum Vergleichen von Dateien oder Verzeichnissen. Wenn sich zwei Dateien unterscheiden, ist es einfach, in den Dateivergleichsmodus zu wechseln und die genauen Unterschiede festzustellen.

17
Alexander

Channel-Landsmann 'billings' (von freenode/# centos fame) teilte mir seine Methode mit:

diff -Naur dir1/ dir2

Das Einfügen des endgültigen Schrägstrichs für die Verzeichnisweiterleitung spielt keine Rolle.

Außerdem scheint die Option -u bei einigen älteren Versionen/Serverversionen von diff nicht verfügbar zu sein.

Der Unterschied in den Unterschieden:

# diff -Nar /tmp/dir1 /tmp/dir2/
diff -Nar /tmp/dir1/file /tmp/dir2/file
28a29
> TEST

# diff -qr /tmp/dir1/ /tmp/dir2/
Files /tmp/dir1/file and /tmp/dir2/file differ
9
todd_dsm

Diffoscope ist ein großartiges befehlszeilenbasiertes Tool zum Vergleichen von Verzeichnissen.

Mir gefällt besonders daran, dass es sich um in Dateien unterscheiden kann:

Es wird rekursiv Archive verschiedenster Art entpacken und verschiedene Binärformate in besser lesbare Form umwandeln, um sie zu vergleichen. Ebenso einfach können zwei Tarballs, ISO-Images oder PDF verglichen werden.

Hier erfahren Sie nicht nur, welche Dateien sich unterscheiden, sondern auch, wie sie sich unterscheiden.

3
nh2

Verwenden Sie diesen Befehl, um diff zu finden:

diff -qr dir1/ dir2/

- r unterscheidet auch alle Unterverzeichnisse - q weist diff an, nur zu melden, wenn sich die Dateien unterscheiden.

diff  --brief dir1/ dir2/

- kurz zeigt die Dateien an, die im Verzeichnis vorhanden sind.

Oder sonst

wir können Meld verwenden, das in einem grafischen Fenster anzeigt, dass es einfach ist, den Unterschied zu finden.

meld  dir1/ dir2/
2
Javeed Shakeel

Sie können auchRsync und find verwenden. Für find:

find $FOLDER -type f | cut -d/ -f2- | sort > /tmp/file_list_$FOLDER

Dateien mit demselben Namen und in denselben Unterordnern, jedoch mit unterschiedlichem Inhalt, werden in den Listen jedoch nicht angezeigt.

Wenn Sie ein Fan von GUI sind, können Sie Meld das @ Alexander erwähnen. Es funktioniert gut in Windows und Linux.

0
Fábio