PDFドキュメント(論文、講義、配布資料)の大きなライブラリがあり、すぐにナビゲートできるようにしたい。そのためにサムネイルが必要です。
しかし、同時に、~/.thumbnails
フォルダーは、本当に必要のない親指で積み重なっていることがわかります。重要なサムを削除せずにサムネイルジャンクを削除することはできません。それらを削除する場合は、重要なPDFドキュメントがあるすべてのフォルダーに移動し、サムネイルキャッシュを再生成する必要があります。
このプロセスを自動化できるようになりたいです。 所定のディレクトリセットのサムを事前キャッシュするようにnautilusに指示できる方法はありますか?
注:私は bashスクリプトのセット を見つけましたドキュメント。スクリプティングの経験が豊富な人がPDF文書用にこれらを調整するか、少なくともPDFで動作するために修正しなければならないことについて正しい方向に向けられるかもしれません文書も。
編集:
この質問に対する回答は非常に圧倒的です。これを解決するために参加したすべての人に感謝します。質問、その回答、およびそれに関するすべての議論は、多くの関係者の共同の努力がどのように最適なソリューションにつながるかを示す素晴らしい例です。これがまさにLinuxとオープンソースをとても素晴らしいものにしている理由です。
提供された答えはすべて、私がこの質問に対して最初に立てた報奨に値するでしょう。それでも、授与される賞金は1つだけです。今後のすべての読者には、問題を最も効率的な方法で解決する答えを選択する義務があります。どのソリューションであるかを判断するため、互換性、速度、出力品質の3つのスクリプトを比較して、最終テストを実行しました。結果は次のとおりです。
Thumbnailer 1、ロッシュ:
互換性:✔ファイル名にスペース; ✔ディレクトリ名のスペース。 ✘freedesktop準拠
速度:12,6秒で95 PDF
品質:ノーチラスの品質
追加特典:1.)既存の親指を持つファイルを自動的にスキップします。 2.)追加のパッケージは不要
Thumbnailer 2、Martin Orda:
互換性:✔ファイル名にスペース; ✔ディレクトリ名のスペース。 ✘freedesktop準拠
速度:70,0秒で95 PDF
Quality:ストック画像よりも大幅に優れたスケーリング。
追加特典:1.)親指が既に存在するファイルを自動的にスキップ2.)PDF以外の幅広い画像形式と互換性がある3.)プラットフォームに依存しない、 GNOMEコンポーネントに依存しない
Thumbnailer 3、James Henstridgeによる:
互換性:✔ファイル名にスペース; ✔ディレクトリ名のスペース。 ✔freedesktopに準拠
速度:10,8秒で95 PDF
品質:ノーチラスの品質
追加特典:1.)親指が既に存在するファイルを自動的にスキップします2.)プレインストールされたサムネラーによって識別されるすべてのファイル形式と互換性があります
3つのスクリプトはすべて優れています。それぞれに長所と短所があります。 Roschのソリューションはそのまま使用できるため、最小限のインストールでユーザーに適した選択肢になる可能性があります。
Martin Ordaは、さまざまなファイル形式で動作し、DEに依存しない非常に用途の広いスクリプトを作成しました。サムネイルの品質は優れていますが、速度は犠牲になります。
結局、私のユースケースに最も適したのはJamesのソリューションでした。高速で汎用性があり、既存のサムネイルでファイルをスキップするオプションを提供します。
総合優勝:ジェームズ・ヘンストリッジ
追加情報:3つのスクリプトはすべてnautilus-scriptsと完全に互換性があります。簡単にインストールできます このチュートリアルに従って 。
Edit 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 __== '__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
制限:
evince-thumbnailer
がそうしているという証拠は見ていません。つまり、nautilusがサムネイルを再生成しない限り、スクリプトをジョブに使用できます。注:
evince-thumbnailer
とconvert
の両方でテストされた37 pdfファイル(imagemagickから):evince-thumbnailer
で3秒、convert
で14秒。Perl
が必要、デフォルトのインストールに存在evince-thumbnailer
で処理されないファイルは、単にエラーを出力します-2>/dev/null
でミュート/usr/share/thumbnailers/evince.thumbnailer
のMimeType行を見て、処理されたファイルタイプのリストを確認します。~/.cache/thumbnails
のようです。readlink
を使用したより堅牢なパス。インスピレーション:
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=683394
しばらく気を取られて、ロッシュは私にそれを打ちました:) 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.
サムネイルの仕様には、共有サムネイルリポジトリが含まれます。これにより、すべてのユーザーが独自のサムネイルを生成するのではなく、事前に生成されたサムネイルを関連ファイルとともに配布できます。したがって、理論的には、サムネイルを生成し、共有リポジトリに追加することができます。したがって、サムネイルディレクトリをクリアしたり、すべてを別のマシンなどに移動した場合、サムネイルを将来生成する必要がなくなります。
http://specifications.freedesktop.org/thumbnail-spec/thumbnail-spec-latest.html#DIRECTORY
このAsk Ubuntuページは、共有サムネイルリポジトリをサポートするアプリケーションがあるかどうかを調べようとしたときに検索結果に表示されます。悲しいことに、それらをサポートするアプリケーションはないようです。