问题描述
我有一个庞大的PDF文档库(论文,讲座,讲义),我希望能够快速浏览。为此,我需要缩略图。
然而,与此同时,我看到~/.thumbnails
文件夹堆积着我并不真正需要的拇指。删除缩略图垃圾而不删除重要的拇指是不可能的。如果我要删除它们,我必须转到包含重要PDF文档的每个文件夹,并让缩略图缓存重新生成。
我希望能够自动化这个过程。有什么方法可以告诉nautilus给pre-cache一组给定目录的大拇指吗?
注意:我确实发现a set of bash scripts似乎对图片和视频执行此操作,但对于任何其他文档都没有。也许对脚本更有经验的人可能能够针对PDF文档调整这些内容,或者至少指出我正在修改的内容,以便与PDF文档一起使用。
编辑:
对这个问题的回答非常热烈。首先,我要感谢参与解决这个问题的所有人。问题,答案以及围绕它的所有讨论都是一个很好的例子,说明了许多方面的协作努力如何能够带来最佳解决方案。这正是Linux和开源这么棒的原因。
所有提供的答案都值得我最初提出的这个问题的赏金。不过,奖励只有一个奖励。我应该为所有未来的读者选择能够以最有效的方式解决问题的答案。为了确定哪个解决方案,我做了最后的测试运行,比较了三个脚本的兼容性,速度和输出质量。结果如下:
Thumbnailer 1,作者:rosch:
兼容性:✔文件名中的空格; ✔目录名称中的空格; ✘符合freedesktop标准
速度:95秒PDF,12,6秒
质量:库存 nautilus 质量
额外的额外津贴:1。)自动跳过具有预先存在的拇指的文件; 2.)不需要额外的包裹
Thumbnailer 2,Martin Orda:
兼容性:✔文件名中的空格; ✔目录名称中的空格; ✘符合freedesktop标准
速度:95个PDF,70,0秒
质量:比库存图像明显更好的缩放。
额外的额外津贴:1。)自动跳过具有预先存在的拇指的文件2.)兼容除PDF 3之外的各种图像格式。)platform-independent,不依赖于GNOME-components
Thumbnailer 3,James Henstridge:
兼容性:✔文件名中的空格; ✔目录名称中的空格; ✔符合freedesktop标准
速度:95秒PDF,10,8秒
质量:库存 nautilus 质量
额外补贴:1。)自动跳过具有预先存在的拇指的文件2.)与预装的缩略图识别的所有文件格式兼容
这三个脚本都很棒。每个都有其独特的优点和缺点。 Rosch的解决方案开箱即用,可能是安装最少的用户的正确选择。
Martin Orda创建了一个非常通用的脚本,可以使用各种文件格式,并且是DE-independent。它擅长缩略图质量,但却以牺牲速度为代价。
最终,James解决方案最适合我的用例。它速度快,功能多样,并提供了跳过具有预先存在的缩略图的文件的选项。
总冠军:James Henstridge
附加信息:所有三个脚本都与nautilus-scripts完全兼容。您可以轻松安装它们following this tutorial。
编辑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-thumbnailer
和convert
(来自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> [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.