Ich habe zwei Verzeichnisse, die die gleichen Dateien enthalten sollten und die gleiche Verzeichnisstruktur haben.
Ich denke, dass in einem dieser Verzeichnisse etwas fehlt.
Gibt es eine Möglichkeit, mithilfe der Bash-Shell meine Verzeichnisse zu vergleichen und festzustellen, ob in einem der Verzeichnisse Dateien fehlen, die in dem anderen vorhanden sind?
command-line
AndreaNobili
quelle
quelle
bash --version
?Antworten:
Ein guter Weg, um diesen Vergleich durchzuführen, ist die Verwendung
find
vonmd5sum
, dann adiff
.Beispiel
Verwenden Sie find, um alle Dateien im Verzeichnis aufzulisten. Berechnen Sie dann den MD5-Hash für jede Datei und leiten Sie ihn sortiert nach Dateinamen in eine Datei um:
Gehen Sie in einem anderen Verzeichnis genauso vor:
Dann vergleiche das Ergebnis zweier Dateien mit
diff
:Oder als einzelner Befehl mit Prozessersetzung:
Wenn Sie nur die Änderungen sehen möchten:
Der Befehl cut gibt nur den Hash (erstes Feld) aus, der mit diff verglichen werden soll. Andernfalls gibt diff jede Zeile aus, da sich die Verzeichnispfade auch bei gleichem Hash unterscheiden.
Aber Sie werden nicht wissen, welche Datei geändert wurde ...
Dafür kann man sowas probieren
Diese Strategie ist sehr nützlich, wenn sich die beiden zu vergleichenden Verzeichnisse nicht auf demselben Computer befinden und Sie sicherstellen müssen, dass die Dateien in beiden Verzeichnissen gleich sind.
Eine andere gute Möglichkeit, den Job zu erledigen, ist die Verwendung des
diff
Befehls von Git (kann Probleme verursachen, wenn Dateien unterschiedliche Berechtigungen haben -> dann wird jede Datei in der Ausgabe aufgelistet):quelle
find
die Dateien aufgelistet werden, im Allgemeinen zwischen den beiden Verzeichnissen unterschiedlich ist.Sie können den
diff
Befehl genauso verwenden, wie Sie ihn für Dateien verwenden würden:Wenn Sie auch Unterordner und -dateien sehen möchten, können Sie die folgende
-r
Option verwenden:quelle
diff
für Verzeichnisse funktioniert (man diff hat dies bestätigt), prüft jedoch nicht rekursiv, ob Änderungen in Unterverzeichnissen innerhalb von Unterverzeichnissen vorliegen.a/b/c/d/a
,x/b/c/d/b
. Sehen Sie, wasdiff a x
Sie gibt.-r
Option verwenden. Das (diff -r a x
) gibt mir:Only in a/b/c/d: a. only in x/b/c/d: b.
Wenn Sie bash nicht verwenden, können Sie diff mit
--brief
und verwenden--recursive
:Das
man diff
beinhaltet beide Optionen:quelle
Hier ist eine Alternative, um nur Dateinamen und nicht deren Inhalt zu vergleichen:
Dies ist eine einfache Möglichkeit, fehlende Dateien aufzulisten, aber es werden natürlich keine Dateien mit demselben Namen, aber unterschiedlichem Inhalt erkannt!
(Ich persönlich benutze mein eigenes
diffdirs
Skript, aber das ist Teil einer größeren Bibliothek .)quelle
diff
nicht unterstützt werden. Aber es gibtcomm
welche, die es unterstützen, da git.savannah.gnu.org/cgit/coreutils.git/commit/…. Sobald es zu einem Coreutils in Ihrer Nähe kommt, können Sie dies tuncomm -z <(cd folder1 && find -print0 | sort) <(cd folder2 && find -print0 | sort -z)
(dessen Ausgabe Sie möglicherweise weiter in das Format konvertieren müssen) Sie müssen den--output-delimiter
Parameter und zusätzliche Werkzeuge verwenden).Möglicherweise besteht eine Möglichkeit darin, rsync zweimal auszuführen:
In der vorherigen Zeile erhalten Sie Dateien, die sich in dir1 befinden und in dir2 unterschiedlich sind (oder fehlen).
Das selbe für dir2
Sie können die
-n
Option löschen , um die Änderungen zu übernehmen. Das kopiert die Liste der Dateien in den zweiten Ordner.In diesem Fall ist es möglicherweise eine gute Option
-u
, neuere Dateien nicht zu überschreiben.Ein Einzeiler:
quelle
Wenn Sie jede Datei erweiterbar und komprimierbar machen möchten, können Sie die Ausgabe von
diff -r
in Vim umleiten.Zuerst geben wir Vim ein Zollstock:
Jetzt gerade:
Sie können schlagen
zo
undzc
Falten öffnen und schließen. Um Vim zu verlassen, drücke:q<Enter>
quelle
Ziemlich einfache Aufgabe in Python zu erreichen:
Tatsächliche Werte für
DIR1
und ersetzenDIR2
.Hier ist ein Probelauf:
Zur besseren Lesbarkeit ist hier ein aktuelles Skript anstelle eines Einzeilers:
quelle
os.listdir
keine bestimmte Reihenfolge gibt. Die Listen könnten also die gleichen Dinge in unterschiedlicher Reihenfolge haben und der Vergleich würde fehlschlagen.Inspiriert von Sergijs Antwort habe ich mein eigenes Python-Skript geschrieben, um zwei Verzeichnisse zu vergleichen.
Im Gegensatz zu vielen anderen Lösungen werden die Inhalte der Dateien nicht verglichen. Es geht auch nicht in Unterverzeichnisse, die in einem der Verzeichnisse fehlen. Die Ausgabe ist also ziemlich kurz und das Skript arbeitet schnell mit großen Verzeichnissen.
Wenn Sie es in einer Datei mit dem Namen speichern
compare_dirs.py
, können Sie es mit Python3.x ausführen:Beispielausgabe:
PS Wenn Sie Dateigrößen und Datei-Hashes auf mögliche Änderungen vergleichen müssen, habe ich hier ein aktualisiertes Skript veröffentlicht: https://gist.github.com/amakukha/f489cbde2afd32817f8e866cf4abe779
quelle
cmpdirs dir1 dir2 '/\.git/'
Ich werde dieser Liste eine NodeJs-Alternative hinzufügen, die ich vor einiger Zeit geschrieben habe.
Dir-Vergleich
quelle
Ich möchte ein großartiges Tool vorschlagen, das ich gerade entdeckt habe: MELD .
Es funktioniert einwandfrei und alles, was Sie mit dem Befehl
diff
auf einem Linux-basierten System tun können, kann dort mit einer schönen grafischen Oberfläche repliziert werden! Genießenquelle