У меня есть крупная библиотека документов в формате PDF (бумаги, лекции, раздаточные материалы), что я хочу смочь быстро перейти через. Для этого мне нужны миниатюры.
В то же время однако я вижу что ~/.thumbnails
папка накапливается с ползунками, в которых я действительно не нуждаюсь. Удаление спама миниатюры, не удаляя важные ползунки невозможно. Если бы я должен был удалить их, то я должен был бы перейти к каждой папке с важными документами в формате PDF и позволить кэшу миниатюры повторно создать.
Я хотел бы смочь автоматизировать этот процесс. Есть ли какой-либо способ, которым я могу сказать наутилусу предварительно кэшировать ползунки для ряда, данного каталоги?
Примечание: Я действительно находил ряд сценариев удара, которые, кажется, делают это для изображений и видео, но не для любых других документов. Возможно, кто-то более опытный со сценариями смог корректировать их для документов в формате PDF или по крайней мере указывать на меня в правильном направлении на том, что я должен буду изменить, чтобы это работало с документами в формате PDF также.
Править:
Ответ на этот вопрос был довольно подавляющим. Позвольте мне сначала благодарить всех, кто участвовал в решении этого. Вопросом, его ответами и всей дискуссией по поводу этого является яркий пример того, как совместное усилие многих сторон может привести к оптимальному решению. Это точно, что делает Linux и Открытый исходный код настолько большими.
Все предоставленные ответы заслужили бы щедрости, которую я первоначально поднял для этого вопроса. Однако, существует только одна щедрость для вознаграждения. Я должен его всем будущим читателям для выбора ответа, который решает проблему самым эффективным способом. Определить, какое решение то есть, я сделал запущенный завершающий тест, сравнив эти три сценария в совместимости, скорости и произвел качество. Вот результаты:
Thumbnailer 1, rosch:
Совместимость: ✔ располагает с интервалами в имени файла; ✔ располагает с интервалами в имени каталога; ✘ freedesktop совместимый
Скорость: 95 PDFs за 12,6 секунд
Качество: качество наутилуса запаса
Дополнительные Льготы: 1.) автоматически пропускает файлы с существующими ранее ползунками; 2.) Никакие дополнительные пакеты не необходимы
Thumbnailer 2, Martin Orda:
Совместимость: ✔ располагает с интервалами в имени файла; ✔ располагает с интервалами в имени каталога; ✘ freedesktop совместимый
Скорость: 95 PDFs за 70,0 секунды
Качество: значительно лучше масштабируясь, чем изображения запаса.
Дополнительные Льготы: 1.) автоматически пропускает файлы с существующими ранее ползунками 2.) совместимый с широким спектром форматов изображения помимо PDF 3.) платформенно независимый, не полагается на компоненты GNOME
Thumbnailer 3, James Henstridge:
Совместимость: ✔ располагает с интервалами в имени файла; ✔ располагает с интервалами в имени каталога; ✔ freedesktop совместимый
Скорость: 95 PDFs за 10,8 секунд
Качество: качество наутилуса запаса
Дополнительные Льготы: 1.) автоматически пропускает файлы с существующими ранее ползунками 2.) совместимый со всеми форматами файлов, которые определяются предварительно установленным thumbnailers
Все три сценария превосходны. У каждого есть его отличный набор преимуществ и недостатков. Работы решения Rosch из поля и могли бы быть правильным выбором для пользователей с минимальной установкой.
Martin Orda создал очень универсальный сценарий, который работает со множеством форматов файлов и является DE-independent. Это выделяется в качестве миниатюры, но делает так за счет скорости.
В конце это было решение James, которые соответствуют моему варианту использования лучше всего. Это быстро, универсально и предлагает опции перескочить через файлы с существующими ранее миниатюрами.
Абсолютный победитель: James Henstridge
Дополнительная информация: Все три сценария полностью совместимы со сценариями наутилуса. Можно легко установить их после этого учебного руководства.
Редактирование 2: Обновленный обзор с улучшенным сценарием rosch.
thumbnailing стандартные программы наутилуса на самом деле прибывают из libgnome-desktop
библиотека, таким образом, возможно выполнить тот же thumbnailers за пределами файлового менеджера.
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
где приложения как Наутилус ожидают находить их.
Спецификация миниатюр включает в себя общие репозитории миниатюр, которые позволяют предварительно генерировать миниатюры, которые будут распространяться вместе со связанными файлами, а не позволять каждому пользователю создавать свои собственные миниатюры. Таким образом, теоретически вы можете сгенерировать миниатюры, а затем добавить их в общий репозиторий, что избавит вас от необходимости генерировать их в будущем, если вы очистите свой каталог с миниатюрами или перенесете их все на другой компьютер или что-то еще.
http://specifications.freedesktop.org/thumbnail-spec/thumbnail-spec-latest.html#DIRECTORY
Эта страница Ask Ubuntu появляется в результатах поиска. когда я пытался выяснить, поддерживает ли какое-либо приложение общие репозитории миниатюр. К сожалению, похоже, что ни одно приложение не поддерживает их.
Был отвлечен некоторое время, и rosch бьют меня к нему :) Не знал проявляют-thumbnailer, существовал (я не пользователь Gnome), но так или иначе, так как я уже записал это, здесь это идет. Это требует, чтобы установленные imagemagick, проверили и установили если не там с:
which convert || sudo apt-get install imagemagick
Save as mkthumb.sh
(например), chmod +x mkthumb.sh
это и выполняет его с полными путями как аргументы (можно использовать-s в качестве его первого paramterer для пропуска генерирующихся миниатюр, которые уже существуют), т.е.:
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.
Сценарий ниже должен сделать задание. Это использует evince-thumbnailer
который - насколько я знаю - идет с каждой установкой гнома и является значением по умолчанию thumbnailer.
Save as 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
делает так. Другими словами.. пока наутилус не повторно создает миниатюры, сценарий может использоваться для задания.Примечания:
evince-thumbnailer
и convert
(от imagemagick): 3 секунды для evince-thumbnailer
и 14 секунд для convert
.perl
, существующий в стандартной установкеevince-thumbnailer
просто произведет ошибку - отключенный звук с 2>/dev/null
/usr/share/thumbnailers/evince.thumbnailer
видеть список обработанных типов файлов~/.cache/thumbnails
.readlink
.Вдохновение:
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=683394
Я записал пакет, который изменил сценарий James для включения многопроцессорной обработки и опции рекурсивно генерировать миниатюры. Пакет pip
- устанавливаемый. Проверьте здесь для инструкций по установке.
пример использования:
thumbgen -w 4 -r -d your_directory
-r
: рекурсивно генерируйте миниатюры
-w
: количество ядер для использования