
Empecé a notar hace algún tiempo en Xfce4 que cuando enviaba algún archivo a la Papelera, el vaso (la miniatura de Xfce4) causaba una carga de E/S muy alta durante bastante tiempo. Al investigar el problema, descubrí que estaba escaneando el directorio ~/.thumbnails, que era muy grande.
Así que decidí escribir un script cron que limpiará periódicamente el directorio ~/.thumbnails, pero hay un cierto directorio de archivos de video grandes para los cuales Tumbler tarda un poco de tiempo, y a veces incluso falla, en crear miniaturas.
La idea es eliminar todas las miniaturas, excepto las de estos videos. Pero para conservar estas miniaturas, tengo que encontrar sus nombres. El problema es que las miniaturas se almacenan con un nombre md5sum del URI, más la extensión PNG.
Al mirarla fuente del vaso, encontré que el nombre de la miniatura se genera en la siguiente línea:
md5_hash = g_compute_checksum_for_string (G_CHECKSUM_MD5, uri, -1);
Eldocumentación para g-compute-checksum-for-stringdice:
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.
En pocas palabras, la miniatura de un archivo denominado /home/teresaejunior/File 01.png
se almacenará en el directorio .thumbnails/ comoa8502be3273541e618b840204479a7f9.png
De acuerdo con laEspecificaciones de miniaturas, URI es file://filename
. Investigué un poco sobre el "carácter nulo" y pensé que \0
funcionaría. Para lograr el resultado a8502be3273541e618b840204479a7f9
, pensé que lo siguiente debería funcionar:
printf "file:///home/teresaejunior/File 01.png\0" | md5sum
pero eso regresa f507285c45d293fa66bc0b813d17b6e6
en su lugar.
¿Alguien puede darme algún consejo? Creo que mi printf
línea es defectuosa. ¿En qué se diferencia mi comando g_compute_checksum_for_string
?
Respuesta1
El carácter NUL no se incluye cuando se calcula el MD5. Más bien, es el carácter espacial el que está causando tu problema. El nombre del archivo escodificado en URL:
$ printf '%s' 'file:///home/teresaejunior/File%2001.png' | md5sum
a8502be3273541e618b840204479a7f9 -
Aquí hay una forma de realizar la conversión con Perl:
$ 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