Как вычислить имя файла миниатюры из оболочки?

Как вычислить имя файла миниатюры из оболочки?

Некоторое время назад я начал замечать в Xfce4, что когда я отправлял какой-либо файл в корзину, tumbler (Xfce4 thumbnailer) вызывал очень высокую нагрузку ввода-вывода в течение довольно долгого времени. После изучения проблемы я обнаружил, что он сканировал каталог ~/.thumbnails, который был очень большим по размеру.

Поэтому я решил написать cron-скрипт, который будет периодически очищать каталог ~/.thumbnails, но есть определенный каталог больших видеофайлов, для которых Tumbler тратит некоторое время, а иногда и вовсе не создает эскизы.

Идея заключается в удалении всех миниатюр, кроме тех, что относятся к этим видео. Но чтобы сохранить эти миниатюры, мне нужно узнать их имена. Проблема в том, что миниатюры хранятся с именами md5sum URI, плюс расширение PNG.

Посмотрев наисточник тумблера, я обнаружил, что имя для миниатюры генерируется в следующей строке:

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

Theдокументация для g-compute-checksum-for-stringговорит:

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.

Короче говоря, миниатюра для указанного файла /home/teresaejunior/File 01.pngбудет сохранена в каталоге .thumbnails/ какa8502be3273541e618b840204479a7f9.png

СогласноThumbnailerSpec, URI — file://filename. Я провел небольшое исследование на тему «нулевого символа» и подумал, что \0это сработает. Чтобы достичь результата a8502be3273541e618b840204479a7f9, я считал, что должно сработать следующее:

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

но f507285c45d293fa66bc0b813d17b6e6вместо этого возвращается.

Может кто-нибудь дать мне совет? Я считаю, что моя printfлиния несовершенна. Чем моя команда отличается от g_compute_checksum_for_string?

решение1

Символ NUL не включается при вычислении MD5. Скорее, проблема в символе пробела. Имя файлаURL-кодированный:

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

Вот один из способов выполнить преобразование с помощью 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

Связанный контент