391 Stimmen

Diff-Dateien in zwei verschiedenen Verzeichnissen

Ich habe zwei Verzeichnisse mit der gleichen Liste von Dateien. Ich muss alle Dateien in beiden Verzeichnissen vergleichen, indem ich die diff Befehl. Gibt es dafür eine einfache Befehlszeilenoption, oder muss ich ein Shell-Skript schreiben, um die Dateiliste zu erhalten und sie dann durchzugehen?

4voto

Rob Wells Punkte 35303

Wenn es GNU diff ist, dann sollten Sie einfach auf die beiden Verzeichnisse zeigen und die Option -r verwenden können.

Andernfalls versuchen Sie es mit

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

N.B. Wie Dennis in den Kommentaren bemerkt hat, müssen Sie die Befehlssubstitution bei ls nicht wirklich durchführen. Ich mache das schon so lange, dass ich das so ziemlich auf Autopilot mache und den Befehl ersetze, den ich brauche, um meine Liste von Dateien zum Vergleich zu bekommen.

Ich habe auch vergessen, hinzuzufügen, dass ich ' \ls ', um meinen Alias von ls auf GNU ls vorübergehend zu deaktivieren, so dass ich die Farbformatierungsinformationen aus der von GNU ls zurückgegebenen Liste verliere.

4voto

Eamonn Kenny Punkte 1601

Wenn ich mit git/svn oder mehreren git/svn-Instanzen auf der Festplatte arbeite, war dies für mich in den letzten 5-10 Jahren eines der nützlichsten Dinge, die jemand nützlich finden könnte:

diff -burN /path/to/directory1 /path/to/directory2 | grep +++

oder:

git diff /path/to/directory1 | grep +++

So erhalten Sie einen Schnappschuss der verschiedenen Dateien, die berührt wurden, ohne dass Sie die Ausgabe "weniger" oder "mehr" machen müssen. Sie können dann einfach die einzelnen Dateien vergleichen.

1voto

Patrick Fromberg Punkte 1267

In der Praxis stellt sich diese Frage oft in Verbindung mit einigen Einschränkungen. In diesem Fall kann die folgende Lösungsvorlage nützlich sein.

cd dir1
find . \( -name '*.txt' -o -iname '*.md' \) | xargs -i diff -u '{}' 'dir2/{}'

0voto

Evgeny Karpov Punkte 2250

Hier ist ein Skript, das die Unterschiede zwischen Dateien in zwei Ordnern anzeigt. 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" )

-6voto

Sonali Birari Punkte 7

Versuchen Sie dies:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X