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?

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

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.


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


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.

...

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.


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" )

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.


-4

Versuche dies:

diff -rq /path/to/folder1 /path/to/folder2      

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.