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

Glu*_*ate 36 nautilus scripts pdf thumbnails

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

然而,与此同时,我看到~/.thumbnails文件夹里堆满了我并不真正需要的拇指。删除缩略图垃圾而不删除重要的拇指是不可能的。如果我要删除它们,我将不得不访问每个包含重要 PDF 文档的文件夹,并让缩略图缓存重新生成。

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

注意:我确实找到了一组 bash 脚本,它们似乎可以对图片和视频执行此操作,但不能对任何其他文档执行此操作。也许在脚本方面更有经验的人可能能够为 PDF 文档调整这些,或者至少为我指出正确的方向,我必须修改它才能处理 PDF 文档。


编辑

对这个问题的回答是相当压倒性的。首先感谢所有参与解决这个问题的人。这个问题、它的答案以及围绕它的所有讨论都是一个很好的例子,说明了多方的协作努力可以导致最佳解决方案。这正是 Linux 和开源如此伟大的原因。

所有提供的答案都值得我最初为这个问题提供的赏金。尽管如此,只有一项赏金可以颁发。我应该让所有未来的读者选择以最有效的方式解决问题的答案。为了确定哪种解决方案,我进行了最终测试,比较了三个脚本的兼容性、速度和输出质量。结果如下:


缩略图 1,作者 rosch:

兼容性: ? 文件名中的空格;? 目录名中的空格;? 兼容自由桌面

速度:12.6 秒内 95 个 PDF

质量:库存鹦鹉螺质量

额外福利:1.) 自动跳过已有拇指的文件;2.) 不需要额外的包

缩略图 2,作者 Martin Orda:

兼容性: ? 文件名中的空格;? 目录名中的空格;? 兼容自由桌面

速度:70.0 秒内 95 个 PDF

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

额外的好处:1.) 自动跳过已有拇指的文件 2.) 兼容除 PDF 之外的各种图像格式 3.) 独立于平台,不依赖于 GNOME 组件

缩略图 3,作者 James Henstridge:

兼容性: ? 文件名中的空格;? 目录名中的空格;? 兼容自由桌面

速度:10.8 秒内 95 个 PDF

质量:库存鹦鹉螺质量

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


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

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

最后,James 的解决方案最适合我的用例。它速度快,用途广泛,并提供跳过带有预先存在的缩略图的文件的选项。


总冠军:詹姆斯·亨斯屈奇


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


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

Jam*_*dge 39

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))
Run Code Online (Sandbox Code Playgroud)

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

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


ros*_*sch 19

下面的脚本应该可以完成这项工作。它使用evince-thumbnailerwhich - 据我所知 - 随每个 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
Run Code Online (Sandbox Code Playgroud)

限制

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

注意事项

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

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


Mar*_*ski 11

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

which convert || sudo apt-get install imagemagick
Run Code Online (Sandbox Code Playgroud)

另存为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
....
Run Code Online (Sandbox Code Playgroud)

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

which convert || sudo apt-get install imagemagick
Run Code Online (Sandbox Code Playgroud)

它可以毫无问题地处理名称中带有空格的文件。

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.
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

12991 次

最近记录:

5 年,3 月 前