Ich möchte einen Linux-Befehl ausführen, der zwei Verzeichnisse rekursiv vergleicht und nur die Dateinamen der Unterschiede ausgibt . Dies schließt alles ein, was in einem Verzeichnis und nicht im anderen oder umgekehrt vorhanden ist, sowie Textunterschiede.
linux
command-line
diff
Barfoon
quelle
quelle
diff
Manpage in CentOS 7 beschreibt-q
"Nur melden, wenn sich Dateien unterscheiden", was weniger klar ist als das, was Sie geschrieben haben.-x PATTERN
in den Befehl einschließen , um bestimmte Unterverzeichnisse auszuschließen. Zum Beispieldiff -qr repo1 repo2 -x ".git"
werden zwei Verzeichnisse vergleichen , sondern wird Dateipfade mit „.git“ in ihnen auszuschließen.Sie können auch rsync verwenden
quelle
--size-only
Es fehlen Dateien mit identischer Größe, aber unterschiedlichem Inhalt, z. B. old / version.txt "29a" new / version.txt "29b" . Verwenden Sie stattdessen:rsync -ric --dry-run old/ new/
wobei das Argument "-i" es ermöglicht, die Dateiliste direkt überrsync -ric --dry-run old/ new/ | cut -d" " -f 2
Wenn Sie eine Liste von Dateien erhalten möchten, die sich nur in einem Verzeichnis befinden und nicht deren Unterverzeichnisse und nur deren Dateinamen:
Wenn Sie rekursiv alle Dateien und Verzeichnisse auflisten möchten, die sich mit ihren vollständigen Pfaden unterscheiden:
Auf diese Weise können Sie auf alle Dateien unterschiedliche Befehle anwenden.
Zum Beispiel könnte ich alle Dateien und Verzeichnisse entfernen, die sich in dir1, aber nicht in dir2 befinden:
quelle
Auf meinem Linux-System bekomme ich nur die Dateinamen
quelle
audit-0.0.234/audit-data-warehouse-0.0.234/ audit-0.0.235/audit-data-warehouse-0.0.235/
diff -qrN /dir1 /dir2 | cut -f2 -d' '
funktioniert gut für mich!Der Ausführungsansatz
diff -qr old/ new/
hat einen großen Nachteil: Möglicherweise fehlen Dateien in neu erstellten Verzeichnissen. Im folgenden Beispiel befindet sich die Dateidata/pages/playground/playground.txt
beispielsweise nicht in der Ausgabe von,diff -qr old/ new/
während sich das Verzeichnisdata/pages/playground/
befindet (suchen Sie in Ihrem Browser nach playground.txt, um sie schnell zu vergleichen). Ich habe auch die folgende Lösung auf Unix & Linux Stack Exchange veröffentlicht , aber ich werde sie auch hier kopieren:Um eine Liste neuer oder geänderter Dateien programmgesteuert zu erstellen, ist die beste Lösung, die ich finden könnte, die Verwendung von rsync , sort und uniq :
Lassen Sie mich anhand dieses Beispiels erklären: Wir möchten zwei Dokuwiki-Versionen vergleichen, um festzustellen, welche Dateien geändert und welche neu erstellt wurden.
Wir holen die Teere mit wget und extrahieren sie in die Verzeichnisse
old/
undnew/
:Wenn Sie rsync auf eine Weise ausführen, werden möglicherweise neu erstellte Dateien übersehen, wie der Vergleich von rsync und diff hier zeigt:
ergibt folgende Ausgabe:
Wenn Sie rsync nur in eine Richtung ausführen, werden die neu erstellten Dateien übersehen, und umgekehrt würden gelöschte Dateien übersehen. Vergleichen Sie die Ausgabe von diff:
ergibt folgende Ausgabe:
Wenn Sie rsync in beide Richtungen ausführen und die Ausgabe sortieren, um Duplikate zu entfernen, werden das Verzeichnis
data/pages/playground/
und die Dateidata/pages/playground/playground.txt
anfangs übersehen:ergibt folgende Ausgabe:
rsync
wird mit diesen Argumenten ausgeführt:-r
"in Verzeichnisse zurückgreifen",-c
um auch Dateien mit identischer Größe zu vergleichen und nur "basierend auf Prüfsumme zu überspringen, nicht Mod-Zeit & Größe",-n
um "einen Probelauf ohne vorgenommene Änderungen durchzuführen" und--out-format="%n"
um "Aktualisierungen mit dem angegebenen FORMAT auszugeben", das hier nur für den Dateinamen "% n" istDie Ausgabe (Liste der Dateien)
rsync
in beide Richtungen wird kombiniert und sortiert mitsort
, und diese sortierte Liste wird dann komprimiert, indem alle Duplikate mit entfernt werdenuniq
quelle
diff new/ old/
), um zu sehen, welche Verzeichnisse gelöscht wurden?diff -qr new/ old/
des obigen Beispiels mit den Dokuwiki-Teeren erzeugt die gleiche Ausgabe wiediff -qr old/ new/
- dh Sie sehen, dass das Verzeichnis neu ist / fehlt, aber nicht die darin enthaltenen Dateienquelle