Diff-Dateien in zwei verschiedenen Verzeichnissen

303

Ich habe zwei Verzeichnisse mit der gleichen Liste von Dateien. Ich muss alle Dateien, die in beiden Verzeichnissen vorhanden sind, mit dem diffBefehl vergleichen. Gibt es eine einfache Befehlszeilenoption, oder muss ich ein Shell-Skript schreiben, um die Dateiliste abzurufen und sie dann zu durchlaufen?

Sudar
quelle

Antworten:

422

Sie können den diffBefehl dafür verwenden:

diff -bur folder1/ folder2/

Dadurch wird ein rekursiver Diff ausgegeben, der Leerzeichen mit einem einheitlichen Kontext ignoriert:

  • b flag bedeutet, Leerzeichen zu ignorieren
  • u flag bedeutet einen einheitlichen Kontext (3 Zeilen davor und danach)
  • r flag bedeutet rekursiv
Laurent Etiemble
quelle
9
Sie können auf den diffBefehl zugreifen, indem Sie die GNU-Dienstprogramme für Win32 herunterladen .
Laurent Etiemble
7
Ich habe auch festgestellt, dass die Option --brief nützlich ist. Sie erhalten eine Liste der geänderten Dateien und können diese separat verarbeiten
Dariusz
27
Wenn Sie sich fragen, -bignoriert Sie Leerzeichenänderungen und -ugibt 3 Pufferzeilen an.
Rattray
28
Es ist einfacher, sich an diesen Befehl zu erinnern, wenn Sie rub anstelle von bur verwenden, dhdiff -rub folder1/ folder2/
SomeGuyOnAComputer
11
Ich würde mir vorstellen, -burdass Sie sich leicht daran erinnern können, wenn Sie in einem kalten Klima leben.
AlanH
126

Wenn Sie nur die Dateien sehen möchten, die sich unterscheiden, können Sie Folgendes verwenden:

diff -qr dir_one dir_two | sort

Die Option "q" zeigt nur die Dateien an, die sich unterscheiden, nicht jedoch den Inhalt, der sich unterscheidet, und "sortieren" ordnet die Ausgabe alphabetisch an.

Suresh
quelle
1
Es ist großartig! Funktioniert auch effizient - dh wenn ein ganzes Unterverzeichnis nur in einem der Verzeichnisse vorhanden ist, wird es nicht mehr wiederholt und meldet nur das Unterverzeichnis selbst (ohne dessen Nachfolgerinhalt). Sehr schön!!
Etwas Etwas
Dies ist ein wirklich guter erster Schritt: sehen , was, wenn überhaupt, nicht unterscheiden, und dann ein detailliertes tut diffauf jedes Paar von unterschiedlichen Dateien. Der Ansatz eines Menschen wäre völlig anders, wenn sich nur eine oder zwei Dateien unterscheiden würden, wenn sich Dutzende von Dateien unterscheiden würden. Ich könnte mich in der Ausgabe von diffDutzenden von Dateien gleichzeitig verlieren !
Jvriesem
Kann auch -x PATTERNin den Befehl einschließen , um bestimmte Unterverzeichnisse auszuschließen. Zum Beispiel diff -qr repo1 repo2 -x ".git"werden zwei Verzeichnisse (Repo1 und repo2) vergleichen , sondern werden die Dateien in .git Ordner der entsprechenden Verzeichnisse ausschließen.
ViFI
20

Diff hat eine Option -r, die genau das tun soll.

diff -r dir1 dir2

CodeRain
quelle
11

diffSie können nicht nur zwei Dateien vergleichen, sondern mithilfe der -rOption ganze Verzeichnisbäume durchsuchen und rekursiv die Unterschiede zwischen Unterverzeichnissen und Dateien überprüfen, die an vergleichbaren Stellen in jedem Baum auftreten.

$ man diff

...

-r  --recursive
        Recursively compare any subdirectories found.

...
miku
quelle
3

Wenn es sich um GNU diff handelt, sollten Sie es nur auf die beiden Verzeichnisse verweisen und die Option -r verwenden können.

Andernfalls versuchen Sie es mit

for i in $(\ls -d ./dir1/*); do diff ${i} dir2; done

NB Wie Dennis im Kommentarbereich hervorhob, müssen Sie die Befehlsersetzung auf dem ls nicht durchführen. Ich mache das schon so lange, dass ich das so ziemlich mit dem Autopiloten mache und den Befehl ersetze, den ich brauche, um meine Liste der Dateien zum Vergleich zu erhalten.

Außerdem habe ich vergessen hinzuzufügen, dass ich '\ ls' mache, um meinen Alias ​​von ls zu GNU ls vorübergehend zu deaktivieren, so dass ich die Farbformatierungsinformationen aus der von GNU ls zurückgegebenen Liste verliere.

Rob Wells
quelle
2
Es ist nicht erforderlich, lsfor i in ./dir1/*
Folgendes
1
@ Tennis, funky Abkürzung. +1. Ich bin es so gewohnt, Befehle zu ersetzen, obwohl dies automatisch geschieht, und ich verwende nur den Befehl, den ich benötige, z. B. manchmal verwende ich find. Wenn ich ls verwende, kann ich auch mehr mit der Verzeichnisliste spielen, z. B. Zeitumkehr basierend auf der Standardsequenz.
Rob Wells
0

Hier ist ein Skript, um Unterschiede zwischen Dateien in zwei Ordnern anzuzeigen. Es funktioniert rekursiv. Ändern Sie dir1 und dir2.

(search() { for i in $1/*; do [ -f "$i" ] && (diff "$1/${i##*/}" "$2/${i##*/}" || echo "files: $1/${i##*/}   $2/${i##*/}"); [ -d "$i" ] && search "$1/${i##*/}" "$2/${i##*/}"; done }; search "dir1" "dir2" )
Evgeny Karpov
quelle
0

Wenn Sie den Inhalt von Dateien nicht vergleichen möchten und nur prüfen möchten, welche nicht in beiden Verzeichnissen vorhanden sind, können Sie Listen von Dateien vergleichen, die von einem anderen Befehl generiert wurden.

diff <(find DIR1 -printf '%P\n' | sort) <(find DIR2 -printf '%P\n' | sort) | grep '^[<>]'

-printf '%P\n'weist findan, den Ausgabepfaden nicht das Stammverzeichnis voranzustellen.

Ich habe auch hinzugefügt sort, um sicherzustellen, dass die Reihenfolge der Dateien bei beiden Aufrufen von gleich ist find.

Das grepam Ende entfernt Informationen über identische Eingabezeilen.

KEIN NAME
quelle
-4

Versuche dies:

diff -rq /path/to/folder1 /path/to/folder2      
Sonali Birari
quelle
2
Dadurch wird eine vorhandene Antwort dupliziert und kein neuer Inhalt hinzugefügt. Bitte posten Sie keine Antwort, es sei denn, Sie haben tatsächlich etwas Neues beizutragen.
Toby Speight