노틸러스에 미리보기 이미지를 미리 생성하도록 지시하려면 어떻게해야합니까?


33

빠르게 탐색 할 수있는 많은 PDF 문서 라이브러리 (서류, 강의, 유인물)가 있습니다. 이를 위해 미리보기 이미지가 필요합니다.

그러나 동시에 ~/.thumbnails폴더가 실제로 필요하지 않은 엄지 손가락으로 쌓여 있음을 알았습니다. 중요한 엄지 손가락을 제거하지 않고 섬네일 정크를 삭제하는 것은 불가능합니다. 그것들을 삭제하려면 중요한 PDF 문서가있는 각 폴더로 이동하여 축소판 캐시를 재생성해야합니다.

이 프로세스를 자동화 할 수 있기를 바랍니다. 주어진 디렉토리 세트에 대해 썸네일을 미리 캐시하도록 노틸러스에 지시 할 수있는 방법이 있습니까?

참고 : 사진 및 비디오에는이 작업을 수행하는 것처럼 보이는 bash 스크립트 세트가 있지만 다른 문서에는 없습니다. 스크립팅에 대해 더 많은 경험이있는 사람은 PDF 문서에 대해 이러한 내용을 조정할 수 있거나 PDF 문서로 작업하기 위해 수정해야 할 사항에 대해 올바른 방향으로 안내 할 수 있습니다.


편집 :

이 질문에 대한 답변은 상당히 압도적입니다. 우선이 문제를 해결하는 데 참여한 모든 사람에게 감사드립니다. 질문, 답변 및 그에 대한 모든 토론은 많은 당사자의 협력 노력이 어떻게 최적의 솔루션으로 이어질 수 있는지에 대한 훌륭한 예입니다. 이것이 바로 리눅스와 오픈 소스를 그렇게 훌륭하게 만드는 이유입니다.

제공된 모든 답변은 원래이 질문에 대해 바운티 바운티를받을 가치가 있습니다. 그럼에도 불구하고 보상 할 현상금은 하나뿐입니다. 나는 미래의 모든 독자들에게 가장 효율적인 방법으로 문제를 해결하는 답변을 선택해야합니다. 어떤 솔루션인지 확인하기 위해 호환성, 속도 및 출력 품질의 세 가지 스크립트를 비교하여 최종 테스트 실행을 수행했습니다. 결과는 다음과 같습니다.


rosch의 Thumbnailer 1

호환성 : ✔ 파일 이름의 공백; ✔ 디렉토리 이름의 공백; ✘ 프리 데스크톱 준수

속도 : 12,6 초 안에 95 개의 PDF

품질 : 재고 노틸러스 품질

추가 특전 : 1.) 기존 엄지 손가락이있는 파일을 자동으로 건너 뜁니다. 2.) 추가 패키지가 필요하지 않습니다

Martin Orda의 Thumbnailer 2

호환성 : ✔ 파일 이름의 공백; ✔ 디렉토리 이름의 공백; ✘ 프리 데스크톱 준수

속도 : 70,0 초 안에 95 개의 PDF

품질 : 스톡 이미지보다 훨씬 나은 스케일링.

추가 특전 : 1.) 기존 엄지 손가락이있는 파일을 자동으로 건너 뜁니다. 2.) PDF 이외의 다양한 이미지 형식과 호환됩니다. 3) 플랫폼 독립적, 그놈 구성 요소에 의존하지

James Henstridge의 Thumbnailer 3

호환성 : ✔ 파일 이름의 공백; ✔ 디렉토리 이름의 공백; ✔ Freedesktop 호환

속도 : 10,8 초 안에 95 개의 PDF

품질 : 재고 노틸러스 품질

추가 특전 : 1.) 기존 엄지 손가락이있는 파일을 자동으로 건너 뜁니다. 2.) 사전 설치된 썸네일 러로 식별되는 모든 파일 형식과 호환


세 가지 스크립트 모두 훌륭합니다. 각각 고유 한 장단점이 있습니다. Rosch의 솔루션은 기본적으로 작동하며 최소한의 설치로 사용자에게 적합한 선택 일 수 있습니다.

Martin Orda는 다양한 파일 형식으로 작동하며 DE에 독립적 인 매우 다양한 스크립트를 작성했습니다. 썸네일 품질은 뛰어나지 만 속도를 희생합니다.

결국 내 유스 케이스에 가장 적합한 것은 James 솔루션이었습니다. 빠르고 다재다능하며 기존 썸네일이있는 파일을 건너 뛸 수있는 옵션을 제공합니다.


총 우승자 : James Henstridge


추가 정보 : 세 스크립트는 모두 노틸러스 스크립트 와 완벽하게 호환됩니다 . 이 튜토리얼에 따라 쉽게 설치할 수 있습니다 .


편집 2 : rosch의 개선 된 스크립트로 리뷰를 업데이트했습니다.


많은 작은 파일이 항상 잘못 종료되기 때문입니다. ~ / .thumbnails 폴더의 크기를 알고 있습니까?
— Antoine Rodriguez

지금 크기가 되었습니까? ~ 1 개월 사용 후 약 85MB
— Glutanimate

그리고 라이브러리에 얼마나 많은 파일이 있습니까? (기술적 인 이유로 / 제한적입니다)
— Antoine Rodriguez

아 잠깐, 나는 잘못 계산했다; 일부 데이터 파일이 포함되어 있습니다. 약 2000
— 년만 기록

그냥 당신을 업데이트 : 나는 당신을위한 솔루션이 있습니다. 너무 오래 걸리므로 며칠이 걸릴 수 있습니다. 감사합니다;)
— 앙투안 로드리게스

답변:


35

노틸러스의 썸네일 루틴은 실제로 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노틸러스와 같은 응용 프로그램에서 찾을 수있는 곳에 저장됩니다 .


1
이 스크립트를 작성하는 데 시간을내어 주셔서 감사합니다. 단일 파일에 대해 알려진 것처럼 작동합니다. 게시 된 솔루션 중에서 시스템에서 출력을 인식하는 유일한 솔루션입니다 (올바른 파일 이름 48eebea785a185cdfc9d8f1a2ed34400.png이 사용됨). 그러나 현재 디렉토리를 지원하지 않는 것 같습니다. 디렉토리를 재귀 적으로 살펴볼 수있는 방법이 있습니까?
— Glutanimate

끝난. 또한 출력도 약간 단순화했습니다.
— James Henstridge

당신의 스크립트는 절대적으로 훌륭하게 작동합니다. 바로 내가 찾던 것이므로 현상금을 수여했습니다. 최종 테스트 실행 중에 오류 메시지 가 발생 했지만 축소판 생성을 방해하지 않는 것 같습니다. 오류는 일부 파일 이름에 German Umlauts ( "ä, ü, ö")가 포함되어 있다는 사실과 관련이있을 수 있습니다. 이 우수한 솔루션을 제공해 주셔서 다시 한 번 감사드립니다. 이제부터는 내 인생이 훨씬 쉬워 질 것입니다.
— Glutanimate

1
이러한 오류는 축소판 중 하나가 사용하는 XML 파서에서 발생하므로 이름이 아닌 일부 파일의 내용과 관련이 있습니다. 위의 썸네일 스크립트는 디렉토리의 모든 파일을 처리하므로 문제가있는 PDF가 아닐 수 있습니다.
— James Henstridge

일반 텍스트 파일의 축소판을 만들 수 없습니다. 이 작업을 수행하기 위해 구성해야 할 것이 있습니까?
— krasnaya

18

아래 스크립트가 작업을 수행해야합니다. 그것은 evince-thumbnailer내가 아는 한 모든 그놈 설치와 함께 제공되며 기본 축소판입니다.
다른 이름으로 저장 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이 그렇게하고 있다는 증거를 보지 못했습니다 . 즉, 노틸러스가 축소판을 재생성하지 않는 한 스크립트를 작업에 사용할 수 있습니다.

참고 사항 :

  • 새 썸네일을 생성 할 때 파일 이름을 인쇄하고, 존재하는 경우 생성을 건너 뜁니다.
  • 속도 : 37 개 PDF 파일은 모두 테스트 evince-thumbnailer하고 convert(ImageMagick과에서)에 대한 삼초 evince-thumbnailer와 대한 14초 convert.
  • 노틸러스가 인식하는 썸네일 생성
  • perl URL : file 모듈이 처리하는 경로 이름 (공백 및 기타 문자는 파일 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


우선 답변과 노력에 감사드립니다. 몇 가지 테스트 실행을 수행했으며 결과는 다음과 같습니다. 1.) 축소판 생성은 이름에 공백이있는 디렉토리에서는 작동하지 않습니다. 2.) 스크립트와 @Martin Orda로 만든 축소판은 시스템에서 인식되지 않습니다. 스크립트로 처리 된 파일은 썸네일이없는 것처럼 처리됩니다-> 결과 : 썸네일 디렉토리에 중복 된 썸네일
— Glutanimate

흠, 내 테스트는 지금까지 긍정적이었습니다. 노틸러스는 썸네일을 인식하고 재생산하지 않았습니다. 어쨌든 폴더 이름의 공백은 나쁜 습관입니다 ..하지만 스크립트를 수정합니다. 미리보기 이미지가 중복됩니까? give 파일에 대한 새 tumbnail의 이름은 무엇입니까?
— rosch

좋아, 다시 시도하고 그것이 지난 번과 같은 결과가 될까봐 두려워합니다. 스크립트가 생성 한 썸네일의 파일 이름은 다음과 같습니다 2a43dc2774e3dfe45a4337e0304e5b0a.png.. 이것이 동일한 썸네일의 이름이 nautilus : 48eebea785a185cdfc9d8f1a2ed34400.png입니다. 또한 스크립트로 생성 된 엄지 손가락은 128x171px이며 내장 썸네일 러는 96x128px 썸네일 만 생성합니다.
— Glutanimate


evince-thumbnailerPNG 태그를 추가하지 않는 것에 대한 귀하의 의견 은 맞습니다. 외부 섬네일 러를 호출하는 코드는 실제로 태그를 포함하도록 이미지를 다시 작성합니다. strings -a노틸러스에서 생성 한 썸네일 중 하나를 실행 하여 이를 확인할 수 있어야합니다 .
— James Henstridge

10

잠시 산만 해졌고 rosch가 나를 이겼습니다. 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

네 말이 맞아-나는 이것을 다시 확인하고 노틸러스가 다시 생성한다는 것을 알았습니다 (어제 밤에 테스트했을 때 그렇지 않았지만 이미 잘못되었을 수 있습니다. 작성했을 때 실제로 더 빠르면 (아직 다른 방법을 사용하지 않은 경우) 몇 시간 안에 작업 할 것입니다. 내가 찾은 유일한 문제는 스크립트에서 생성 한 파일과 노틸러스가 <thumbnail>을 식별 할 때 "PNG 97x128 97x128 + 0 + 0 8 비트 DirectClass 20.4KB 0.000u 0 : 00.000"과 동일한 속성을 나타냅니다.
— Marcin Kaminski

아니, 우리 둘 다 틀렸다 :) 썸네일의 파일 이름이 'file : //'+ absolute_path의 md5 해시이며 실수로 스크립트를 ./mkthumb.sh -s Downloads / pdf / test 대신 실행했다는 것을 잊었습니다. /mkthumb.sh -s / home / user / Downloads / pdf / test. 다시 시도하십시오.
— Marcin Kaminski

좋아, 나는 또 다른 테스트를 수행했으며 특이한 점은 두 스크립트 rosch 모두 같은 문제가있는 것 같습니다. 스크립트가 2a43dc2774e3dfe45a4337e0304e5b0a.png있는 파일 이름은 노틸러스가로 이름을 지정하는 동안 48eebea785a185cdfc9d8f1a2ed34400.png입니다. 그러나 치수는 스크립트에 따라 다릅니다. 비교는 다음과 같습니다
— Glutanimate

귀하의 스크립트가 여전히 여기에 게시 된 것 중 가장 빠르다는 것을 추가하고 싶습니다. imagemagick또한 스케일링을보다 훨씬 잘 처리하는 것으로 보입니다 evince-thumbnailer(참조는 위의 비교 참조).
— Glutanimate

1

썸네일 사양에는 공유 썸네일 리포지토리가 포함되어있어 모든 사용자가 자신의 썸네일을 생성하지 않고 미리 생성 된 썸네일을 관련 파일과 함께 배포 할 수 있습니다. 따라서 이론적으로 썸네일을 생성 한 다음 공유 리포지토리에 추가 할 수 있으므로 썸네일 디렉토리를 지우거나 다른 시스템이나 다른 시스템으로 옮길 경우 나중에 생성 할 필요가 없습니다.

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

이 응용 프로그램은 공유 축소판 저장소를 지원하는 응용 프로그램이 있는지 확인하려고 할 때 검색 결과에 우분투 요청 페이지가 나타납니다. 슬프게도 응용 프로그램이 지원하지 않는 것으로 보입니다.


1

멀티 프로세싱과 재귀 적으로 썸네일 생성 옵션을 포함하도록 James의 스크립트를 수정 한 패키지를 작성했습니다. 패키지는 pip-installable입니다. 설치 지침은 여기 를 확인 하십시오 .

사용 예는 다음과 같습니다.

thumbgen -w 4 -r -d your_directory
  • -r: 재귀 적으로 썸네일 생성

  • -w: 사용할 코어 수

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.