
Некоторое время назад я начал замечать в 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