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


33

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

但是,与此同时,我看到该~/.thumbnails文件夹中堆积了一些我并不需要的拇指。在不删除重要拇指的情况下删除缩略图垃圾是不可能的。如果要删除它们,则必须转到每个包含重要PDF文档的文件夹,并让缩略图缓存重新生成。

我希望能够自动化此过程。有什么办法可以让Nautilus预缓存一组给定目录的指针?

注意:我确实找到了一组bash脚本,似乎对图片和视频执行此操作,但对其他任何文档均不执行此操作。也许对脚本编写经验比较丰富的人也许能够针对PDF文档进行调整,或者至少将我的正确方向指出要与PDF文档一起使用时需要进行哪些修改。


编辑

对这个问题的反应非常热烈。首先,我感谢参与解决这一问题的每个人。该问题及其答案以及围绕它的所有讨论都是一个很好的例子,说明了许多方面的合作可以如何导致最佳解决方案。这正是使Linux和开源如此出色的原因。

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


缩略图1,由rosch:

兼容性:✔文件名中有空格; ✔目录名中的空格;✘符合Freedesktop

速度:在12,6秒内达到95个PDF

质量:鹦鹉螺质量

额外的特权:1.)自动跳过已有拇指的文件;2.)不需要其他软件包

Martin Orda提供的Thumbnailer 2

兼容性:✔文件名中有空格; ✔目录名中的空格;✘符合Freedesktop

速度:70,0秒内95个PDF

质量:比原始图片的缩放比例好得多。

其他优点:1.)自动跳过带有先前拇指的文件2.)与PDF兼容的图像格式也广泛兼容3.)与平台无关,不依赖GNOME组件

James Henstridge撰写的Thumbnailer 3

兼容性:✔文件名中有空格; ✔目录名中的空格;✔符合Freedesktop

速度:10,8秒内95个PDF

质量:鹦鹉螺质量

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


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

Martin Orda创建了一个非常通用的脚本,该脚本可以处理多种文件格式,并且与DE无关。它在缩略图质量方面表现出色,但以速度为代价。

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


总冠军:James Henstridge


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


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


因为很多小文件总是结局很差。您知道〜/ .thumbnails文件夹的大小吗?
安东尼·罗德里格斯

您是说现在的大小是多少?使用约1个月后约85MB。
谷氨酰胺

图书馆有多少文件?(出于技术原因/限制)
Antoine Rodriguez

啊,等等,我算错了;其中包括一些数据文件。只是其对2000年的文件
Glutanimate

只为更新您:我为您提供解决方案。编辑时间很长,所以请允许我几天。问候;)
安东尼·罗德里格斯

Answers:


35

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如果尚未安装该软件包,则可能还需要安装该软件包。

之后,只需使用要缩略图的文件或文件夹作为参数来调用脚本。缩略图将保存到~/.thumbnailsNautilus之类的应用程序期望找到它们的位置。


1
谢谢James,抽出宝贵的时间编写此脚本。它的工作方式与单个文件的广告相同。在已发布的解决方案中,它是唯一可以被系统识别的输出(使用正确的文件名48eebea785a185cdfc9d8f1a2ed34400.png)的解决方案。但是,目前看来它不支持目录。有什么办法可以使其递归通过目录?
谷氨酰胺

做完了 我也简化了输出。
詹姆斯·亨斯特里奇

您的脚本绝对不错。这正是我在寻找的东西,因此我授予了赏金。我在进行最终测试时确实遇到了一些错误消息,但是它们似乎并未妨碍缩略图的生成。该错误可能与以下事实有关:某些文件名包含德语Umlauts(“ä,ü,ö”)。再次感谢您提供这种出色的解决方案。从现在开始,它将使我的生活更加轻松。
谷氨酰胺

1
这些错误是由于其中一个缩略图使用的XML分析器引起的,因此将与某个文件的内容而不是其名称有关。上面的缩略图脚本将处理目录中的所有文件,因此它可能不是遇到问题的PDF。
詹姆斯·亨斯特里奇

我无法为纯文本文件创建缩略图。我需要配置一些东西才能使它工作吗?
krasnaya

18

下面的脚本可以完成这项工作。据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-thumbnailer和的37个pdf文件convert(来自imagemagick):分别为3秒evince-thumbnailer和14 秒convert
  • 生成鹦鹉螺识别的缩略图
  • 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


首先,感谢您的回答和您的投入。我做了一些测试,结果如下:1.)缩略图生成不适用于名称中带有空格的目录;2.)系统无法识别使用您的脚本和@Martin Orda创建的缩略图。使用脚本处理的文件就像没有缩略图一样处理->结果:缩略图目录中的拇指重复
Glutanimate 2012年

嗯,到目前为止,我的测试是肯定的:鹦鹉螺可以识别缩略图,并且不会重新生成它们。folder,文件夹名中的空格是我不习惯的做法。.但是我将修改脚本。缩略图重复?那么给定文件的新缩略图的名称是什么?
rosch 2012年

好的,再试一次,恐怕结果与上次相同。这是脚本生成的缩略图的文件名:2a43dc2774e3dfe45a4337e0304e5b0a.png。这就是nautilus:命名同一缩略图的方式48eebea785a185cdfc9d8f1a2ed34400.png。我还注意到,使用您的脚本创建的缩略图为128x171px,而内置的缩略图仅创建96x128px的缩略图。
谷氨酰胺


关于您对evince-thumbnailer不添加PNG标签的评论,这是正确的:调用外部缩略图的代码实际上重写了图像以包含标签。您应该能够通过运行strings -aNautilus生成的缩略图之一来验证这一点。
詹姆斯·亨斯特里奇

10

有一段时间分散了注意力,被罗什(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> [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.

同样,感谢您提供了出色的脚本。我进行了一些测试,结果如下:1.)缩略图生成效果很好,并且比evince-thumbnailer更快;2.)用您的脚本和@rosch创建的缩略图无法被系统识别;使用脚本处理的文件就像没有缩略图一样被处理。手动访问目录时会创建新的拇指->结果:缩略图目录中的拇指重复
Glutanimate 2012年

您是对的-我再次检查了一下,发现nautilus再次生成了它们(我认为昨晚进行测试时不是这种情况,但我可能错了,已经来晚了)。如果确实如您所写的那样快(我还没有使用其他方法),我将在几个小时内进行处理。我发现的唯一问题是我的脚本生成的文件和鹦鹉螺文件都具有相同的属性:当我使用identify <缩略图>时,“ PNG 97x128 97x128 + 0 + 0 8位DirectClass 20.4KB 0.000u 0:00.000”。
马钦·卡明斯基

不,我们俩都错了:)原来我忘了缩略图的文件名是'file://'+ absolute_path的md5哈希,错误地将我的脚本运行为./mkthumb.sh -s Downloads / pdf / test而不是。 /mkthumb.sh -s / home / user / Downloads / pdf / test。尝试再次尝试。
Marcin Kaminski 2012年

好吧,我又进行了一次测试,奇怪的是,您的脚本rosch似乎都存在相同的问题:脚本中的文件名是2a43dc2774e3dfe45a4337e0304e5b0a.pngnautilus并将其命名为48eebea785a185cdfc9d8f1a2ed34400.png。但是,尺寸与您的脚本是正确的。这是一个比较
Glutanimate 2012年

我想补充一点,您的脚本仍然是此处发布的脚本中最快的。imagemagick似乎还比缩放处理要好得多evince-thumbnailer(请参阅上面的比较作为参考)。
谷氨酰胺

1

缩略图规范包括共享的缩略图存储库,该共享库允许预生成的缩略图与关联的文件一起分发,而不是让每个用户都生成自己的缩略图。因此,从理论上讲,您可以生成缩略图,然后将其添加到共享存储库中,这样一来,如果您清除缩略图目录,或将它们全部移至其他计算机或其他设备,则将来无需生成它们。

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

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


1

我写了一个程序包,修改了James的脚本以包括多处理和递归生成缩略图的选项。该软件包是可pip安装的。检查这里的安装说明。

用法示例是:

thumbgen -w 4 -r -d your_directory
  • -r:递归生成缩略图

  • -w:要使用的内核数

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.