Konsistent Sortieren in Linux

LC_COLLATE reicht nicht

Verfasst von Boris Stumm am Freitag, 17. August 2018

Diese Woche stand ich vor der Aufgabe, eine Menge von Dateien anhand bestimmter Kriterien zu finden und einen konsistenten Hash über die Dateiinhalte zu bilden, um leicht Änderungen feststellen zu können. Sowas geht mit den üblichen Kommandozeilentools recht einfach:

find [...] | sort | xargs cat | sha1sum > out.txt

Ich war etwas verwundert als das dann auf dem Buildserver (CentOS) einen anderen Hash als lokal (Ubuntu) produzierte. Der Grund war eine unterschiedliche Sortierreihenfolge auf den beiden Rechnern, das war schnell klar. Etwas länger dauerte es, überall die gleiche Reihenfolge zu bekommen.

Grundsätzlich wird die Sortierung über die Umgebungsvariable LC_COLLATE gesteuert, das brachte allerdings nicht den gewünschten Erfolg. Erst als ich auch LC_ALL angeglichen hatte war die Sortierung tatsächlich konsistent. Ich bin mir nicht sicher, ob dieses Verhalten ein Bug oder ein Feature ist. Zumindest zeigt es wieder ein mal sehr deutlich, dass "einfache" Probleme wie das Sortieren von Zeichenketten doch viel komplizierter sind als sie aussehen. Meine Hash-Berechnung sah am Ende so aus:

find [...] | LC_ALL=C sort | xargs cat | sha1sum > out.txt