Verwenden Sie diff für Textdateien mit Dateiliste, um unterschiedliche Dateien nach Größe und / oder geändertem Datum und Uhrzeit zu finden

470
IMTheNachoMan

Ich muss zwei Ordner vergleichen, um Dateien zu finden, die entweder

  • unterschiedliche Größe und / oder geändertes Datum / Uhrzeit
  • fehlt von einem

Ich kann diffin meiner Situation nicht gegen die beiden Ordner laufen . Mein Plan war, findbeide Ordner zu verwenden und die Ausgabe in zwei Textdateien zu speichern und dann die beiden Textdateien mit zu vergleichen diff.

Ich gehe davon aus, dass dies funktionieren würde, aber ich muss sicher sein, dass meine Quell- / Zielverzeichnisse riesig sind und wenn mein Test keinen Unterschied zeigt oder er nicht alle Unterschiede findet, hätte ich keine Möglichkeit zu wissen, ob es funktioniert hat oder nicht.

Wenn die beiden Ordner genau gleich sind, gehe ich davon aus, dass es funktionieren würde. Ich frage mich jedoch, was passieren würde, wenn ein Ordner sehr viel komplexere Unterverzeichnisse / Dateien hätte. Kann diffeine Ordnerstruktur beim Drucken verstehen?

Ich mache zum Beispiel an einem Tag eine Bestandsaufnahme des Ordners.

$ find /path/to/folder -exec ls -ld {} \; > inventory-20181101.txt ... 

Ich werde einige Dinge ändern, einschließlich Hinzufügen, Entfernen, Bearbeiten von Dateien und Hinzufügen oder Entfernen von Ordnern und Unterordnern. Dann werde ich einen anderen Tag ein anderes Inventar machen.

$ find /path/to/folder -exec ls -ld {} \; > inventory-20181102.txt ... 

Dann werde ich die beiden Dateien unterscheiden.

$ diff inventory-20181101.txt inventory-20181102.txt 

Ich gehe davon aus, dass dies funktionieren wird, wenn keine Änderungen vorgenommen wurden oder die Änderungen geringfügig waren, z. B. das Ändern von Dateien. Aber was passiert, wenn ich 5 Ebenen verschachtelter Ordner und 100 Dateien hinzufüge und einen anderen Ordner der obersten Ebene entferne? Werden diffdie richtigen Ordner abgeglichen?

0
Bitte beachten Sie, dass https://superuser.com kein kostenloser Skript- / Code-Schreibservice ist. Wenn Sie uns sagen, was Sie bisher versucht haben (einschließlich der Skripts / des Codes, die Sie bereits verwenden) und wo Sie stecken bleiben, können wir versuchen, bei bestimmten Problemen zu helfen. Sie sollten auch lesen [Wie kann ich eine gute Frage stellen?] (Https://superuser.com/help/how-to-ask). DavidPostill vor 5 Jahren 1
@DavidPostill Ich bitte niemanden, ein Skript für mich zu schreiben. Ich frage nach der Funktionsweise von "diff" und kann Unterschiede in den Ordnerstrukturen, die in einer Textdatei gespeichert sind, nachvollziehen. Ich werde meine Frage ausführlicher behandeln. Vielen Dank! IMTheNachoMan vor 5 Jahren 1
(1) `find` kann nicht garantiert die Dateien in einem Verzeichnis in einer bestimmten Reihenfolge auflisten. Wenn Sie es zweimal hintereinander ausführen, werden wahrscheinlich dieselben Ergebnisse erzielt. Nach monatelangem Durcheinander im Verzeichnisbaum haben sich die Dinge jedoch wahrscheinlich geändert. Dateien, die in keiner Weise geändert wurden, befinden sich möglicherweise in derselben relativen Reihenfolge, aber ich bezweifle, dass auch das garantiert ist. (2) `diff` ist bekannt dafür, dass es nach großen Änderungen nicht zu einer" Neusynchronisierung "kommt, so dass einige unveränderte Zeilen als gelöscht und eingefügt gemeldet werden können. Es wird wahrscheinlich keine Änderungen * verfehlen *. Scott vor 5 Jahren 2
Wie wäre es, es einfach in einem Dummy-Ordner auszuprobieren, um die Variationen zu testen? Erstellen Sie ein paar Beispiele für jede Sache, um die Sie sich Sorgen machen, und sehen Sie, wie Ihr Ansatz funktioniert. Wenn es mit der Situation fertig wird, ändert sich die Menge nicht. fixer1234 vor 5 Jahren 2
@ fixer1234 Ich habe einige Tests gemacht und es hat funktioniert, aber ich möchte sichergehen, dass es für große Ordner mit Millionen von Dateien funktioniert. Es klingt wie aus Scotts Kommentar, dass "find" und "diff" für mich nicht zuverlässig sein werden. IMTheNachoMan vor 5 Jahren 0
@Scott Danke! Das hilft mir Ich muss einen besseren Weg finden, um das zu tun, was ich will. IMTheNachoMan vor 5 Jahren 0

1 Antwort auf die Frage

2
n.st

Um einen zuverlässigen Überblick zu erhalten, benötigen Sie einheitliche und sortierbare Listen der Dateien in beiden Verzeichnissen und eine Möglichkeit, diese beiden Listen zu vergleichen.

Wie bereits erwähnt, diffsollen lesbare, semantisch sinnvolle Übersichten über Unterschiede zwischen Dateien erstellt werden. Dies macht es sehr geeignet für den Vergleich von Klartext oder Code, aber weniger für den Vergleich von Listen.
Verwenden Sie stattdessen die commSuche nach Gemeinsamkeiten oder Unterschieden zwischen zwei Listen.

Um eine "saubere" Liste zu erstellen, die nur die Informationen enthält, die Sie benötigen, verwenden Sie die -printfvon GNU bereitgestellte Option find. Es ist effizienter und robuster, als lsfür jede Datei einen Prozess zu starten, und es kann nützliche Informationen direkt ausgeben, wie:

  • %Tk File's last modification time in the format specified by k
  • %s File's size in bytes
  • %p File's name

Alles zusammenstellen:

  1. Listen Sie die Dateien in jedem Verzeichnis auf (in einem Format, das nur die erforderlichen Informationen enthält) → find … -printf …
  2. Sortieren Sie die Listen → sort
  3. Finden Sie alle Zeilen, die zwischen den Listen nicht identisch sind → comm -3: "Spalte 3 unterdrücken (Zeilen, die in beiden Dateien erscheinen)"
 cd dir1 && find . -printf '%T+ %s %p\n' | sort > ../dir1.txt && cd .. cd dir2 && find . -printf '%T+ %s %p\n' | sort > ../dir2.txt && cd .. comm -3 dir1.txt dir2.txt > differences.txt 

Eine Einschränkung %T+: Das Datumsformat enthält Sekundenbruchteile (2018-11-25 + 14: 58: 43.1197033990). Wenn Ihre beiden Verzeichnisse in unterschiedlichen Dateisystemen mit unterschiedlichen Datumsgenauigkeiten gespeichert sind, müssen Sie möglicherweise ein anderes (manuelles) Datumsformat verwenden, um die Sekundenbruchteile auszuschließen.

Das sind fantastische Informationen. Ich werde es versuchen. Ich danke dir sehr! IMTheNachoMan vor 5 Jahren 0
Die Verwendung von "find… -printf", "sort" und "comm" sind alles gute Ideen. Ein paar kleine Anmerkungen: (1) Das obige wird nach Änderungszeit sortiert. Das Sortieren nach Dateiname ist möglicherweise benutzerfreundlicher. (2) Wie immer können Sie bei der Verarbeitung der Ausgabe von "find" mit Dateien in Schwierigkeiten geraten, deren Namen Zeilenumbrüche enthalten. Dateien, deren Namen Leerzeichen oder Tabulatoren enthalten, können ebenfalls ein Problem sein, insbesondere wenn sie mit Leerzeichen oder Tabulatoren beginnen. (Ich hätte dies in [meinem ersten Kommentar] erwähnen sollen (https://superuser.com/q/1377900/150988#comment2077322_1377900).) Scott vor 5 Jahren 0