Como calcular um nome de arquivo em miniatura a partir do shell?

Como calcular um nome de arquivo em miniatura a partir do shell?

Comecei a notar há algum tempo no Xfce4 que quando eu enviava algum arquivo para a Lixeira, o tumbler (o miniaturador do Xfce4) causava uma carga de E/S muito alta por algum tempo. Ao investigar o problema, descobri que ele estava verificando o diretório ~/.thumbnails, que era muito grande.

Então decidi escrever um script cron que limpará periodicamente o diretório ~/.thumbnails, mas há um certo diretório de arquivos de vídeo grandes para os quais o tumbler leva um pouco de tempo e às vezes até falha para criar miniaturas.

A ideia é remover todas as miniaturas, exceto as desses vídeos. Mas para manter essas miniaturas, preciso descobrir quais são seus nomes. O problema é que as miniaturas são armazenadas com o nome md5sum do URI, mais a extensão PNG.

Ao olhara fonte do copo, descobri que o nome da miniatura é gerado na seguinte linha:

md5_hash = g_compute_checksum_for_string (G_CHECKSUM_MD5, uri, -1);

Odocumentação para g-compute-checksum-for-stringdiz:

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.

Para resumir, a miniatura de um arquivo nomeado /home/teresaejunior/File 01.pngserá armazenada no diretório .thumbnails/ comoa8502be3273541e618b840204479a7f9.png

De acordo comEspecificação de miniatura, URI é file://filename. Fiz algumas pesquisas sobre o "caractere nulo" e pensei \0que funcionaria. Para alcançar o resultado a8502be3273541e618b840204479a7f9, acreditei que o seguinte deveria funcionar:

printf "file:///home/teresaejunior/File 01.png\0" | md5sum

mas isso retorna f507285c45d293fa66bc0b813d17b6e6em vez disso.

Alguém pode me dar alguns conselhos? Acredito que minha printflinha é falha. Qual é a diferença entre meu comando e g_compute_checksum_for_string?

Responder1

O caractere NUL não é incluído quando o MD5 é calculado. Em vez disso, é o caractere de espaço que está causando o seu problema. O nome do arquivo éCodificado por URL:

$ printf '%s' 'file:///home/teresaejunior/File%2001.png' | md5sum
a8502be3273541e618b840204479a7f9  -

Aqui está uma maneira de fazer a conversão com 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

informação relacionada