如何指示Nautilus预先生成缩略图?

我有一个庞大的PDF文档库(论文,讲座,讲义),我希望能够快速浏览。 为此,我需要缩略图。

然而,与此同时,我看到~/.thumbnails文件夹堆积着我并不真正需要的拇指。 删除缩略图垃圾而不删除重要的拇指是不可能的。 如果我要删除它们,我必须使用重要的PDF文档转到每个文件夹,并让缩略图缓存重新生成。

我希望能够自动化这个过程。 有什么方法可以告诉nautilus预先缓存一组给定目录的拇指吗?

注意 :我确实找到了一组bash脚本 ,它们似乎是针对图片和video执行此操作,但不会针对任何其他文档执行此操作。 也许对脚本更有经验的人可能能够针对PDF文档调整这些内容,或者至少指出我需要修改的内容,以便与PDF文档一起使用。


编辑

对这个问题的回应非常压倒性。 首先,我要感谢参与解决这个问题的所有人。 问题,答案以及围绕它的所有讨论都是一个很好的例子,说明了许多方的协作努力如何能够产生最佳解决方案。 这正是Linux和开源这么好的原因。

所有提供的答案都值得我最初为这个问题提出的赏金。 尽管如此,奖励只有一个奖励。 我非常感谢所有未来的读者选择能够以最有效的方式解决问题的答案。 为了确定哪个解决方案,我做了最后的测试运行,比较了三个脚本的兼容性,速度和输出质量。 结果如下:


Thumbnailer 1 ,作者:rosch:

兼容性 :✔文件名中的空格; ✔目录名称中的空格; ✘符合freedesktop标准

速度 :95秒PDF,12,6秒

质量 :库存鹦鹉螺质量

额外的额外津贴 :1。)自动跳过具有预先存在的拇指的文件; 2.)不需要额外的包裹

Thumbnailer 2 ,Martin Orda:

兼容性 :✔文件名中的空格; ✔目录名称中的空格; ✘符合freedesktop标准

速度 :在70,0秒内获得95个PDF

质量 :比库存图像明显更好的缩放。

额外的额外补贴 :1。)自动跳过具有预先存在的拇指的文件2.)兼容除PDF之外的各种图像格式3.)与平台无关,不依赖于GNOME组件

Thumbnailer 3 ,James Henstridge:

兼容性 :✔文件名中的空格; ✔目录名称中的空格; ✔符合freedesktop标准

速度 :10,8秒内95个PDF

质量 :库存鹦鹉螺质量

额外补贴 :1。)自动跳过具有预先存在的拇指的文件2.)与预装的缩略图识别的所有文件格式兼容


这三个脚本都很棒。 每个都有其独特的优点和缺点。 Rosch的解决方案开箱即用,对于安装最少的用户来说可能是正确的选择。

Martin Orda创建了一个非常通用的脚本,可以使用各种文件格式,并且与DE无关。 它擅长缩略图质量,但却以牺牲速度为代价。

最终,James解决方案最适合我的用例。 它速度快,function多样,并提供了跳过具有预先存在的缩略图的文件的选项。


总冠军: James Henstridge


附加信息 :所有三个脚本都与nautilus脚本完全兼容。 您可以按照本教程轻松安装它们。


编辑2 :使用rosch改进的脚本更新了评论。

Nautilus的缩略图程序实际上来自libgnome-desktop库,因此可以在文件管理器之外运行相同的缩略图。

API有点复杂,但以下Python脚本应该有所帮助:

 #!/usr/bin/python import os import sys from gi.repository import Gio, GnomeDesktop def make_thumbnail(factory, filename): mtime = os.path.getmtime(filename) # Use Gio to determine the URI and mime type f = Gio.file_new_for_path(filename) uri = f.get_uri() info = f.query_info( 'standard::content-type', Gio.FileQueryInfoFlags.NONE, None) mime_type = info.get_content_type() if factory.lookup(uri, mtime) is not None: print "FRESH %s" % uri return False if not factory.can_thumbnail(uri, mime_type, mtime): print "UNSUPPORTED %s" % uri return False thumbnail = factory.generate_thumbnail(uri, mime_type) if thumbnail is None: print "ERROR %s" % uri return False print "OK %s" % uri factory.save_thumbnail(thumbnail, uri, mtime) return True def thumbnail_folder(factory, folder): for dirpath, dirnames, filenames in os.walk(folder): for filename in filenames: make_thumbnail(factory, os.path.join(dirpath, filename)) def main(argv): factory = GnomeDesktop.DesktopThumbnailFactory() for filename in argv[1:]: if os.path.isdir(filename): thumbnail_folder(factory, filename) else: make_thumbnail(factory, filename) if __name__ == '__main__': sys.exit(main(sys.argv)) 

将其保存到文件并将其标记为可执行文件。 您可能还需要安装gir1.2-gnomedesktop-3.0软件包(如果尚未安装)。

之后,只需使用您想要缩略图作为参数的文件或文件夹调用脚本。 缩略图将保存到~/.thumbnails ,Nautilus等应用程序希望找到它们。

下面的脚本应该完成这项工作。 它使用了evince-thumbnailer ,据我所知,它随每个gnome安装而来,是默认的缩略图。
保存为 pdfthumbnailer.sh并使其可执行。
用法pdfthumbnailer.sh dir1 [dir2, ...]

 #!/bin/bash F1=$HOME/.thumbnails/normal F2=$HOME/.cache/thumbnails/normal SAVE_FOLDER=$F1 [ -e $F2 ] && SAVE_FOLDER=$F2 # the thumbnailing function evincethumb() { outname=$(echo -n "$(readlink -f "$0")" | \ perl -MURI::file -MDigest::MD5=md5_hex -ne 'print md5_hex(URI::file->new($_));') # no work if thumbnail already present [ ! -e $SAVE_FOLDER/${outname}.png ] && { echo "$0" #uncomment only one of both thumbnailers #convert -thumbnail 128x128 "$0"[0] $SAVE_FOLDER/${outname}.png 2>/dev/null evince-thumbnailer -s 128 "$0" $SAVE_FOLDER/${outname}.png 2>/dev/null } } # make our function visible to the subshell in "find -exec" below export -f evincethumb # loop through all given folders for folder in "$@" ; do find "$folder" -type f -exec bash -c evincethumb {} \; done 

限制

  • 如James Henstridge所指出的,不会将Thumb :: URI和Thumb :: MTime属性添加到缩略图中。 到目前为止,我没有看到默认的evince-thumbnailer正在这样做的证据。 换句话说……只要nautilus不重新生成缩略图,脚本就可以用于作业。

备注

  • 生成新缩略图时打印文件的名称,如果存在则跳过生成
  • 速度:使用evince-thumbnailerconvert (来自imagemagick)测试的37个pdf文件: evince-thumbnailer为3秒, convert为14秒。
  • 生成由nautilus识别的缩略图
  • perl URL处理的路径名:文件模块(空格和其他字符被正确翻译成文件uri)
  • 需要perl ,存在于默认安装中
  • evince-thumbnailer未处理的文件只会输出错误 – 用2>/dev/null静音
  • 查看/usr/share/thumbnailers/evince.thumbnailer中的MimeType行以查看已处理文件类型的列表
  • 更新:从12.04开始,缩略图文件夹似乎是~/.cache/thumbnails
    使用readlink更强大的路径。

灵感
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=683394

分心了一会儿,rosch打败了我:)不知道evince-thumbnailer存在(我不是Gnome用户)但是无论如何,因为我已经写过了,所以就这样了。 它需要安装imagemagick,如果没有安装,请检查并安装:

 which convert || sudo apt-get install imagemagick 

保存为mkthumb.sh (例如), chmod +x mkthumb.sh并使用绝对路径作为参数执行它(您可以使用-s作为其第一个参数来跳过生成已存在的缩略图),即:

 user@host $ ./mkthumb.sh -s /home/user/Downloads /home/user/blah Processing directory /home/user/Downloads/pics/ OK /home/user/Downloads/pics/FeO08.jpg OK /home/user/Downloads/pics/UrOCu.jpg OK /home/user/Downloads/pics/34ATZ.gif OK /home/user/Downloads/pics/WBRE3.jpg OK /home/user/Downloads/pics/LjLdH.jpg OK /home/user/Downloads/pics/xvvae (1).jpg SKIP /home/user/Downloads/pics/itcrowd.jpg OK /home/user/Downloads/pics/76180344.jpg OK /home/user/Downloads/pics/fgk5N.jpg .... 

该脚本(我稍微修改了它以支持大多数图像,如果需要,可以添加更多扩展名):

 #!/bin/bash # USAGE: mkthumb.sh [-s]  [abs_path] # create nautilus thumbnails for images and PDFs in the directories (and their # sub-directories) given as parameters. # -s is used to skip generating thumbnails that already exist skip_existing=0 if [[ "${1}" == "-s" ]]; then skip_existing=1 shift fi mkthumb() { file="${1}" dest="${2}" convert -thumbnail 128x128 "${file}[0]" "${dest}" &>/dev/null if (( $? == 0 )); then echo "OK ${file}" else echo "FAIL ${file}" fi } OLDIFS="${IFS}" IFS=$'\n' for dir in $@; do realdir=`realpath "${dir}"` echo "Processing directory ${realdir}" for file in $(find "${realdir}" -regextype posix-egrep -iregex \ '.*\.(pdf|png|jpg|gif|jpeg)'); do md5=$(echo -n "${file}" | perl -MURI::file -MDigest::MD5=md5_hex -ne \ 'print md5_hex(URI::file->new($_));') dest="${HOME}/.thumbnails/normal/${md5}.png" if [[ -f "${dest}" ]]; then if [[ "${skip_existing}" == "0" ]]; then mkthumb "${file}" "${dest}" else echo "SKIP ${file}" fi else mkthumb "${file}" "${dest}" fi done done IFS="${OLDIFS}" 

它处理名称中带空格的文件没有问题。

 A bit of testing here: user@host $ find .thumbnails/ .thumbnails/ .thumbnails/fail .thumbnails/fail/gnome-thumbnail-factory .thumbnails/normal # ok - no thumbnails present. user@host $ ./mkthumb.sh -s /home/user/Downloads/pdf/test/ Processing directory /home/user/Downloads/pdf/test/ OK /home/user/Downloads/pdf/test/800pdf.pdf OK /home/user/Downloads/pdf/test/3_TO_pricelist.pdf OK /home/user/Downloads/pdf/test/111011-speisekarte-mit-desserts.pdf OK /home/user/Downloads/pdf/test/1186157_r4f3a355eb104a (1).pdf user@host $ touch tstamp user@host $ ./mkthumb.sh -s /home/user/Downloads/pdf/test/ Processing directory /home/user/Downloads/pdf/test/ SKIP /home/user/Downloads/pdf/test/800pdf.pdf SKIP /home/user/Downloads/pdf/test/3_TO_pricelist.pdf SKIP /home/user/Downloads/pdf/test/111011-speisekarte-mit-desserts.pdf SKIP /home/user/Downloads/pdf/test/1186157_r4f3a355eb104a (1).pdf # running nautilus once now to see if it generates new thumbnails # checking for new thumbnails: user@host $ find .thumbnails/ -newer tstamp # None. 

缩略图规范包括共享缩略图存储库,其允许预生成缩略图与关联文件一起分发,而不是让每个用户生成他们自己的缩略图。 因此理论上你可以生成缩略图,然后将它们添加到共享存储库,从而无需在将来清除缩略图目录或将它们全部移动到其他机器或其他任何内容时生成它们。

http://specifications.freedesktop.org/thumbnail-spec/thumbnail-spec-latest.html#DIRECTORY

当我试图找出是否有任何应用程序支持共享缩略图存储库时,这个Ask Ubuntu页面出现在搜索结果中。 可悲的是,似乎没有应用程序支持它们。