
Mir ist vor einiger Zeit aufgefallen, dass Tumbler (der Thumbnailer von Xfce4) bei Xfce4-Dateien, die ich in den Papierkorb schickte, über einen längeren Zeitraum eine sehr hohe E/A-Last verursachte. Als ich das Problem untersuchte, stellte ich fest, dass es das Verzeichnis ~/.thumbnails durchsuchte, das sehr groß war.
Daher habe ich beschlossen, ein Cron-Skript zu schreiben, das das Verzeichnis ~/.thumbnails regelmäßig bereinigt. Es gibt jedoch ein bestimmtes Verzeichnis mit großen Videodateien, für die Tumbler einige Zeit braucht und bei dem das Erstellen von Miniaturansichten manchmal sogar fehlschlägt.
Die Idee ist, alle Miniaturansichten außer denen für diese Videos zu entfernen. Aber um diese Miniaturansichten zu behalten, muss ich herausfinden, wie sie heißen. Das Problem ist, dass Miniaturansichten mit einer MD5-Summe der URI plus der PNG-Erweiterung gespeichert werden.
Beim Betrachtendie Tumbler-Quelle, ich habe festgestellt, dass der Name für die Miniaturansicht in der folgenden Zeile generiert wird:
md5_hash = g_compute_checksum_for_string (G_CHECKSUM_MD5, uri, -1);
DerDokumentation für g-compute-checksum-for-stringsagt:
g_compute_checksum_for_string(GChecksumType checksum_type,
const gchar *str,
gssize length);
checksum_type: a GChecksumType
str: the string to compute the checksum of
length: the length of the string, or -1 if the string is null-terminated.
Kurz gesagt, das Vorschaubild einer Datei mit dem Namen /home/teresaejunior/File 01.png
wird im Verzeichnis .thumbnails/ gespeichert alsa8502be3273541e618b840204479a7f9.png
Entsprechend derMiniaturbildspezifikation, URI ist file://filename
. Ich habe etwas über das „Nullzeichen“ recherchiert und dachte, \0
das würde funktionieren. Um das Ergebnis zu erreichen a8502be3273541e618b840204479a7f9
, dachte ich, das Folgende müsste funktionieren:
printf "file:///home/teresaejunior/File 01.png\0" | md5sum
aber das kommt f507285c45d293fa66bc0b813d17b6e6
stattdessen zurück.
Kann mir jemand einen Rat geben? Ich glaube, meine printf
Zeile ist fehlerhaft. Was macht mein Befehl anders als g_compute_checksum_for_string
?
Antwort1
Das NUL-Zeichen wird bei der MD5-Berechnung nicht berücksichtigt. Vielmehr ist es das Leerzeichen, das Ihr Problem verursacht. Der Dateiname lautetURL-kodiert:
$ printf '%s' 'file:///home/teresaejunior/File%2001.png' | md5sum
a8502be3273541e618b840204479a7f9 -
Hier ist eine Möglichkeit, die Konvertierung mit Perl durchzuführen:
$ perl -MURI::file -MDigest::MD5=md5_hex \
-e 'printf "%s.png\n", md5_hex(URI::file->new(shift))' \
'/home/teresaejunior/File 01.png'
a8502be3273541e618b840204479a7f9.png