Diff über große Unterverzeichnisse schlägt fehl

0

Ich vergleiche zwei große Verzeichnisse auf zwei verschiedenen externen FireWire 800-Festplatten

diff -r /path/to/directory1 /path/to/directory2 

Die Größe des Verzeichnisses (und seiner Unterverzeichnisse) auf einer FireWire-Festplatte beträgt 118,2 GB für 30.000 Elemente und 119,56 GB für 30.031 Elemente.

Ich war überrascht über die vielen Unterschiede, die in der Ausgabe gemeldet wurden

Binary files /path/to/directory1/with/subdirectory/file_xyz and /path/to/directory2/with/subdirectory/file_xyz differ

und begann einige von ihnen einzeln zu vergleichen. Wenn ich sie vergleiche mit

diff /path/to/directory1/with/subdirectory/with/subdirectory/file_xyz /path/to/directory2/with/subdirectory/with/subdirectory/file_xyz

oder auch

diff  /path/to/directory1/with/subdirectory/ /path/to/directory2/with/subdirectory/ 

diff meldet keine Unterschiede zwischen diesen Dateien oder Verzeichnissen.

Was könnte ein Grund sein, warum der "große Vergleich" so viele Unterschiede meldet (oder anscheinend fehlschlägt), während der kleinere Blockvergleich dies nicht tut?


Änderungen seit dem ursprünglichen Beitrag:

  1. Die von diffmir verwendete Version ist GNU Diffutils 2.8.1.
  2. Nur eine wilde Vermutung hier, aber könnte es etwas damit zu tun haben, dass sich diese Verzeichnisse auf externen Festplatten befinden, die eine Art Timeout erfahren könnten?
  3. Ich führte einen weiteren Vergleich durch und wurde erneut mit vielen Unterschieden zwischen diesen Verzeichnissen konfrontiert. Ich habe dann den Energiesparmodus der Systemeinstellung so eingestellt, dass das Display 1 Stunde lang nicht in den Ruhezustand versetzt wird, da ich gemessen hatte, time diff -r /path/to/directory1 /path/to/directory2dass es zwischen 45 und 50 Minuten dauert, bis das Diff fertig ist. Meine Festplatten und der Mac schlafen nie ein.
    Ich habe dann beide Laufwerke abgehängt und wieder angehängt. Lief das Diff wieder und voilà keine Unterschiede außer einer Datei gefunden. Ich habe die angegebene Datei manuell verglichen und festgestellt, dass sie identisch ist.
    Dies scheint zu bestätigen, was ich durch den Vergleich kleinerer Stücke zuvor gefunden habe. Es scheint auch zu bestätigen, dass mit einem Timeout, wie zuvor vermutet, etwas los ist, aber ich frage mich immer noch, obWenn ein FireWire-Laufwerk nicht mehr verfügbar ist oder was auch immer, sollte diff keinen Unterschied melden, sondern "Datei nicht verfügbar" oder "Nur in / yada / yada / directory: file_xyz" sagen.
    Interessanterweise dauerte der Unterschied vor dem erneuten Einhängen 28 Minuten, nach dem erneuten Einhängen fast 51 Minuten.
    Im Lichte dessen: Was kann ich tun, um so etwas zu verhindern?
    Man könnte natürlich sagen, dass man das Display niemals so einstellen soll, dass es in den Ruhezustand wechselt, aber das scheint das zugrunde liegende Problem kaum zu lösen. Etwas anderes muss los sein, ich kann einfach nicht herausfinden, was.

    Abgesehen davon habe ich bei früheren Gelegenheiten nach einer gewissen Zeit der Inaktivität auf diesen FireWire - Festplatten versucht, in eine Datei zu schreiben und habe die Meldung * Fehlercode - 50 "erhalten (wohlgemerkt, dass ich während des Tests nichts davon gesehen habe) Ich konnte das Problem immer "lösen", indem ich die Laufwerke abmontierte und erneut montierte, aber ich glaube, dass es eine ganz andere Lösung dafür geben muss: Lösungen wie die hier vorgestellten scheinen das zugrunde liegende Problem kaum anzugehen.
    Der Fehlercode -50 wird während des Schreibvorgangs angezeigt, nachdem die externe Festplatte für eine Weile inaktiv war
Alex Ixeras
quelle
Wollen Sie damit spekulieren, dass große Datenstrukturen das Drosseln trivial machen? Irgendwann werden Tausende von Dingen jedes Werkzeug verstopfen. Oder geht es darum, ein Werkzeug zu finden, das einen großen Job auflösen kann?
bmike
@bmike Tausende Dinge sollten auf keinen Fall diff drosseln. Es wird seit Jahrzehnten verwendet, um eine große Anzahl von Dateien zu vergleichen - ich würde definitiv nicht erwarten, dass es fehlerhaft ist, wenn man Tausende von Dateien vergleicht.
Jksoegaard
@bmike Nicht auf der Suche nach Spekulationen, sondern nach möglichen Gründen, Erfahrungen oder vielleicht sogar einer Lösung im Umgang mit diff. Ich habe (noch) nicht daran gedacht, eine große Aufgabe zu lösen, weil ich, wie jksoegaard sagt, den Eindruck hatte, dass diff in der Lage sein sollte, solche Dinge zu bewältigen. Ich mache keine Petabyte-Vergleiche mit Millionen von Dateien. // Ich werde dem Post ein paar Gedanken hinzufügen, in der Hoffnung, dass es nicht zu viele Fragen gibt ...
Alex Ixeras
Ich würde in diffutils Quellcode für eine CHANGELOG-Datei stöbern, die möglicherweise Hinweise auf einen Fehler enthält, der behoben wurde.
fd0
@ fd0 Ich habe mir die Gnu angeschaut und die neueste Version 3.6 von ftpmirror.gnu.org/diffutils heruntergeladen , aber interessanterweise war keine CHANGELOG-Datei im Lieferumfang enthalten. Ich habe auch dieses gefunden, konnte aber nichts wirklich sehen, was das Problem lösen könnte : fossies.org/linux/misc/diffutils-3.6.tar.xz/diffutils-3.6/… . // Könnte mein Problem Ihrer Erfahrung nach etwas damit zu tun haben, dass sich die beiden Verzeichnisse auf zwei externen Festplatten befinden?
Alex Ixeras

Antworten:

0

Ich habe eine Woche lang eine empfohlene Lösung getestet , die ich bei iFixit gefunden habe, als auf einer externen Festplatte ein Fehlercode -50 aufgetreten ist . Es scheint das Problem zu lösen, das ich hatte. Ich bin auch auf den Fehlercode -50 gestoßen, als ich versucht habe, Dateien zu kopieren, aber dies nicht sofort mit meinem Problem fehlerhafter Diffs verknüpft habe. Ich hatte den Verdacht, dass eine gewisse Inaktivität auf den externen Festplatten für den Ausfall verantwortlich war, und der Artikel scheint dies zu bestätigen. Um von dort für die Lösung zu zitieren, sollten Sie auf ähnliche Probleme stoßen:

Um diesen Fehler zu umgehen, gehen Sie zu Systemeinstellungen-> Energiesparmodus und aktivieren Sie auf Ihrem Computer sowohl für Akku als auch für Netzteil das Kontrollkästchen neben "Festplatten in den Energiesparmodus versetzen, wenn dies möglich ist". Ja, das bedeutet, dass das Betriebssystem alle Laufwerke in den Ruhezustand versetzt, wenn dies möglich ist, aber nur so kann ich das Problem beheben.

Was zu passieren scheint, ist, dass einige externe Laufwerke über Firmware verfügen, die Inaktivität erkennt und die Laufwerke herunterfährt. Wenn OSX nicht mit der oben genannten Energiespareinstellung konfiguriert ist, erwartet OSX nicht, dass die Laufwerke in den Energiesparmodus versetzt werden. Wenn auf das Laufwerk zugegriffen wird, nachdem es sich selbst in den Ruhezustand versetzt hat, kommt es offensichtlich zu einem Durcheinander, und der Fehler -50 wird neben anderen Problemen ausgegeben.

Wenn Sie das Betriebssystem so konfigurieren, dass die Festplatten in den Energiesparmodus versetzt werden, gibt das Betriebssystem Startbefehle aus.


Das einzige, was mich jedoch verwundert oder überrascht, ist, warum difftatsächliche Unterschiede in Dateien gemeldet werden, obwohl es tatsächlich nicht richtig auf die Datei zugreifen konnte (?).

Alex Ixeras
quelle