¿Cómo calcular un nombre de archivo en miniatura desde el shell?

¿Cómo calcular un nombre de archivo en miniatura desde el shell?

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.pngse 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 \0funcionarí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 f507285c45d293fa66bc0b813d17b6e6en su lugar.

¿Alguien puede darme algún consejo? Creo que mi printflí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

información relacionada