如何从 shell 计算缩略图文件名?

如何从 shell 计算缩略图文件名?

不久前我开始注意到,在 Xfce4 中,当我将一些文件发送到垃圾箱时,tumbler(Xfce4 缩略图器)会在相当长的一段时间内导致非常高的 I/O 负载。在调查该问题后,我发现它正在扫描 ~/.thumbnails 目录,该目录非常大。

所以我决定编写一个 cron 脚本来定期清理 ~/.thumbnails 目录,但是有一个特定的大型视频文件目录,tumbler 需要花费一些时间,有时甚至会失败,才能为其创建缩略图。

这个想法是删除所有缩略图,除了这些视频的缩略图。但为了保留这些缩略图,我必须找到它们的名字。问题是缩略图存储时使用 URI 的 md5sum 以及 PNG 扩展名进行命名。

看完之后不倒翁来源,我发现缩略图的名称是在以下行中生成的:

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

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

根据缩略图规格,URI 是file://filename。我对“空字符”做了一些研究,认为\0可以解决问题。为了达到这个结果a8502be3273541e618b840204479a7f9,我相信以下应该起作用:

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

但这f507285c45d293fa66bc0b813d17b6e6反而返回了。

有人可以给我一些建议吗?我相信我的printf路线有缺陷。我的命令与 有何不同g_compute_checksum_for_string

答案1

计算MD5时不包含NUL字符。相反,是空格字符导致了您的问题。文件名是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

相关内容