Was ist die beste und einfachste Möglichkeit, zwei Verzeichnisstrukturen zu vergleichen, ohne die Daten in Dateien zu vergleichen? Das funktioniert gut:
diff -qr dir1 dir2_
Aber es ist wirklich langsam, weil es auch Dateien vergleicht. Gibt es einen Schalter für diff oder ein anderes einfaches cli-Tool, um dies zu tun?
linux
comparison
Jonah
quelle
quelle
-type d
Option aus der Antwort von @ slartibartfast, oder checke meine Antwort aus.Antworten:
Das Folgende (wenn Sie das erste Verzeichnis für Verzeichnis1 und das zweite für Verzeichnis2 einsetzen) sollte schnell und genau das tun, wonach Sie suchen:
Das Grundprinzip besteht darin, dass alle Verzeichnisse einschließlich der Unterverzeichnispfade relativ zu den Basisverzeichnissen N gedruckt werden.
Dies kann zum Absturz führen (was zu einer seltsamen Ausgabe führt), wenn Sie in einigen Verzeichnisnamen Wagenrückläufe haben, andere jedoch nicht.
quelle
diff -rq
zeigt nur, dass das Stammverzeichnis in einem vorhanden ist, und macht weiter.zeigt Ihnen nebeneinander die beiden Verzeichnishierarchien nebeneinander an, wobei alle gemeinsamen Abschnitte gefaltet sind.
quelle
Ich benutze normalerweise
rsync
für diese Aufgabe:SEI SEHR VORSICHTIG immer das benutzen
-n
aka--dry-run
, Option, oder es werden die Verzeichnisse synchronisiert (der Inhalt wird geändert).Dadurch werden Dateien anhand der Änderungszeiten und -größen verglichen ... I denken das willst du wirklich oder zumindest stört es dich nicht, wenn es das tut? Ich habe das Gefühl, dass Sie nur wollen, dass es passiert schneller Nicht, dass Sie es brauchen, um den Unterschied zwischen Dateiinhalten zu ignorieren. Wenn Sie nicht möchten, dass es unterschiedliche Dateien mit identischen Namen auflistet, denke ich, dass der Zusatz
--ignore-existing
Option wird das tun.Seien Sie sich auch bewusst, dass Sie keine setzen
/
am Ende vonDIR1
wird es veranlassen, die zu vergleichen VerzeichnisDIR1
mit dem Inhalt vonDIR2
.Die Ausgabe ist etwas ausführlich, zeigt Ihnen jedoch, welche Dateien / Verzeichnisse unterschiedlich sind. Dateien / Verzeichnisse in
DIR2
und nicht inDIR1
wird mit dem Wort eingeleitetdeleting
.In einigen Situationen ist die Antwort von @ slartibartfast möglicherweise geeigneter, obwohl Sie die entfernen müssen
-type d
Option zum Aktivieren der Auflistung von Nicht-Verzeichnisdateien.rsync
wird schneller sein, wenn Sie eine erhebliche Anzahl von Dateien / Verzeichnissen zum Vergleichen haben.quelle
deleting...
Text, aber es ist wahrscheinlich eine der besseren Möglichkeiten, Dateien zu vergleichen, während die Geschwindigkeit erhalten bleibt. Andere Antworten hier sind schneller, wenn das Vergleichen von Dateien nicht erforderlich ist ... wie im Beispiel von OP, aber ich mag dieses wirklich.sudo -u nobody rsync -nav --delete d1 d2
vorausgesetzt, die Flags für 'Andere' erlauben das Lesen.Ähnlich der Antwort von ls, aber wenn Sie installieren Baum dann kannst du
quelle
diff <( tree dir1 ) <( tree dir2 )
i
Flagge, die die Baumlinien nicht druckt (tree -i dir1
, usw). Wenn sich die Verzeichnisstruktur an einer Stelle unterscheidet, weisen die anderen Dateien, die übereinstimmen, möglicherweise mehr oder weniger auf|
Symbole in der Baumausgabe und diff werden diese Zeilen auch dann abfangen, wenn die Dateipfade identisch sind.Ich habe nur nach einer Lösung für dieses Problem gesucht. Die Lösung, die mir am besten gefallen hat, war:
Sie erhalten 3 Spalten: 1 - Dateien nur in DIR1, 2 - Dateien nur in DIR2, 3 - Dateien nur in DIR3 Weitere Details finden Sie hier Blogeintrag.
quelle
DIR3
spezifizierten? Ich sehe nurDIR1
undDIR2
.DIR1
im Spalte 1 , alle Dateien nur inDIR2
im Spalte 2 und alle Dateien von beiden geteilt im Spalte 3 . Das ist irgendwie nützlich, aber weißt du, wie man sich ausziehen könnte? Spalte 3 und nur die Unterschiede lassen? Ich habe ein Menge von Dateien zu sortieren, und die meisten davon sind identisch. Ich muss nicht sehen, was das Gleiche ist.comm <(ls DIR1) <(ls DIR2)
hat nicht rekursiv funktioniert. Dafür habe ich verwendetcomm <(ls -R1 DIR1) <(ls -R1 DIR2)
.ls -R
durchsucht rekursiv durch Verzeichnisse undls -1
(Beachten Sie, dass dies ein ist ein nicht ein L ) machtls
Gib nur einen Dateinamen pro Zeile aus.comm -3
(sehenman comm
).Dann vergleichen Sie einfach die beiden Listen.
quelle
Dies ist die optimale Lösung
- Briefwechsel meldet nur, ob sich die Dateien unterscheiden, nicht die Details der Differenz.
quelle
-q
in der frage ist das ein alias für--brief
. Diese Antwort liefert keine neuen Informationen.But it's really slow because it's comparing files too.
Verwenden Sie "diff -qr", um die verschiedenen Dateien abzurufen, und filtern Sie dann den Dateivergleich mit grep heraus, um nur die Dateinamen zu erhalten, die sich nur in einem der Verzeichnisse befinden.
quelle
Ich denke, nur Rsync ist nützlich. Warum?
diff ist nur für Strukturen nützlich, die Dateien und Verzeichnisse enthalten. Diff verwendet keine ausreichenden Beendigungscodes, wenn wir Symlinks verwenden. In dieser Situation kann diff 2 Exitcodes zurückgeben, auch wenn src und dst identisch sind (Zeiten, Größen, Namen, Zeitstempel, Softlinks zum Zeigen usw.).
Das Dateisystem garantiert nicht die Reihenfolge der Dateien, selbst wenn der Inhalt von src und dst identisch ist. Vielleicht sollten Sie die Ausgabe von ls filtern, indem Sie sie sortieren. Pure ls zeigt jedoch nur Knotennamen an.
Vielleicht ist ein Skript mit diff, cmp und test -X für Knotentypen nützlich, aber denken Sie daran, dass viele Test- / cmp-Läufe eine Überlastung verursachen. Das Skript wird sehr langsam sein.
Wenn Sie wie üblich die einfache Information "dirs ist / ist nicht identisch" erhalten möchten, sollten Sie rsync mit der Option -n (dry) verwenden. Wenn Sie herausfinden möchten, was anders ist, verwenden Sie den Befehl diff.
quelle