Làm cách nào tôi có thể hướng dẫn Nautilus tạo trước hình thu nhỏ?


33

Tôi có một thư viện lớn các tài liệu PDF (giấy tờ, bài giảng, tài liệu phát hành) mà tôi muốn có thể nhanh chóng điều hướng qua. Cho rằng tôi cần hình thu nhỏ.

Tuy nhiên, đồng thời, tôi thấy rằng ~/.thumbnailsthư mục đang chồng chất với ngón tay cái mà tôi không thực sự cần. Xóa hình thu nhỏ rác mà không loại bỏ các ngón tay cái quan trọng là không thể. Nếu tôi xóa chúng, tôi sẽ phải đi đến từng thư mục với các tài liệu PDF quan trọng và để bộ đệm hình thu nhỏ được tạo lại.

Tôi rất thích có thể tự động hóa quá trình này. Có cách nào tôi có thể nói với nautilus để lưu trước ngón tay cái cho một tập các thư mục đã cho không?

Lưu ý : Tôi đã tìm thấy một tập các bash script xuất hiện để làm điều này cho hình ảnh và video, nhưng không phải cho bất kỳ tài liệu nào khác. Có lẽ ai đó có kinh nghiệm hơn với việc viết kịch bản có thể điều chỉnh những điều này cho các tài liệu PDF hoặc ít nhất là chỉ cho tôi đi đúng hướng về những gì tôi phải sửa đổi để điều này cũng hoạt động với các tài liệu PDF.


Chỉnh sửa :

Câu trả lời cho câu hỏi này là khá áp đảo. Trước tiên tôi xin cảm ơn tất cả những người đã tham gia giải quyết điều này. Câu hỏi, câu trả lời của nó và tất cả các cuộc thảo luận xung quanh nó là một ví dụ tuyệt vời về cách nỗ lực hợp tác của nhiều bên có thể dẫn đến một giải pháp tối ưu. Đây chính xác là những gì làm cho Linux và Nguồn mở trở nên tuyệt vời.

Tất cả các câu trả lời được cung cấp sẽ xứng đáng với tiền thưởng ban đầu tôi đưa ra cho câu hỏi này. Tuy nhiên, chỉ có một tiền thưởng để trao giải. Tôi nợ tất cả các độc giả tương lai để chọn câu trả lời giải quyết vấn đề theo cách hiệu quả nhất. Để xác định đó là giải pháp nào, tôi đã thực hiện một thử nghiệm cuối cùng, so sánh ba tập lệnh về tính tương thích, tốc độ và chất lượng đầu ra. Đây là kết quả:


Thumbnailer 1 , bởi rosch:

Khả năng tương thích : ✔ khoảng trắng trong tên tệp; ✔ không gian trong tên thư mục; Freedesktop tuân thủ

Tốc độ : 95 tệp PDF trong 12,6 giây

Chất lượng : chất lượng chứng khoán nautilus

Các đặc quyền bổ sung : 1.) tự động bỏ qua các tệp có ngón tay cái có sẵn; 2.) Không có gói bổ sung cần thiết

Hình thu nhỏ 2 , của Martin Orda:

Khả năng tương thích : ✔ khoảng trắng trong tên tệp; ✔ không gian trong tên thư mục; Freedesktop tuân thủ

Tốc độ : 95 tệp PDF trong 70,0 giây

Chất lượng : tỉ lệ tốt hơn đáng kể so với hình ảnh chứng khoán.

Các đặc quyền bổ sung : 1.) tự động bỏ qua các tệp có ngón tay cái có sẵn 2.) tương thích với một loạt các định dạng hình ảnh bên cạnh PDF 3.) độc lập với nền tảng, không phụ thuộc vào các thành phần Gnome

Hình thu nhỏ 3 , của James Henstridge:

Khả năng tương thích : ✔ khoảng trắng trong tên tệp; ✔ không gian trong tên thư mục; ✔ tuân thủ freedesktop

Tốc độ : 95 tệp PDF trong 10,8 giây

Chất lượng : chất lượng chứng khoán nautilus

Các đặc quyền bổ sung : 1.) tự động bỏ qua các tệp có ngón tay cái có sẵn 2.) tương thích với tất cả các định dạng tệp được xác định bởi các hình thu nhỏ được cài đặt sẵn


Cả ba kịch bản đều xuất sắc. Mỗi cái đều có những ưu điểm và nhược điểm riêng biệt. Giải pháp của Rosch hoạt động tốt và có thể là lựa chọn phù hợp cho người dùng với cài đặt tối thiểu.

Martin Orda đã tạo ra một kịch bản rất linh hoạt, hoạt động với nhiều định dạng tệp và không phụ thuộc vào DE. Nó vượt trội về chất lượng hình thu nhỏ nhưng làm như vậy với chi phí tốc độ.

Cuối cùng, đó là giải pháp James phù hợp nhất với trường hợp sử dụng của tôi. Nó nhanh, linh hoạt và cung cấp các tùy chọn để bỏ qua các tệp có hình thu nhỏ có sẵn.


Người chiến thắng chung cuộc: James Henstridge


Thông tin bổ sung : Tất cả ba tập lệnh đều tương thích hoàn toàn với tập lệnh nautilus . Bạn có thể dễ dàng cài đặt chúng theo hướng dẫn này .


Chỉnh sửa 2 : Cập nhật đánh giá với kịch bản được cải thiện bởi rosch.


Bởi vì rất nhiều tập tin nhỏ luôn kết thúc tồi tệ. Bạn có biết kích thước của thư mục ~ / .thumbnails của bạn không?
Antoine Rodriguez

Bạn có nghĩa là kích thước nó là ngay bây giờ? khoảng 85MB sau ~ 1 tháng sử dụng.
Glutimate

Và thư viện của bạn có bao nhiêu tập tin? (đó là vì lý do / giới hạn kỹ thuật)
Antoine Rodriguez

ah chờ đã, tôi tính toán sai; bao gồm một số tệp dữ liệu. Tài liệu chỉ khoảng 2000.
Glutimate

Chỉ cần cập nhật cho bạn: Tôi có một giải pháp cho bạn. Nó dài để làm lại, vì vậy cho phép tôi một vài ngày. Trân trọng;)
Antoine Rodriguez

Câu trả lời:


35

Thói quen thu nhỏ của Nautilus thực sự đến từ libgnome-desktopthư viện, do đó có thể chạy cùng một hình thu nhỏ bên ngoài trình quản lý tệp.

API hơi phức tạp, nhưng tập lệnh Python sau sẽ giúp:

#!/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))

Lưu nó vào một tập tin và đánh dấu nó thực thi. Bạn cũng có thể cần cài đặt gir1.2-gnomedesktop-3.0gói nếu nó chưa được cài đặt.

Sau đó, chỉ cần gọi tập lệnh với các tệp hoặc thư mục bạn muốn thu nhỏ làm đối số. Hình thu nhỏ sẽ được lưu vào ~/.thumbnailsnơi các ứng dụng như Nautilus mong muốn tìm thấy chúng.


1
Cảm ơn bạn, James, vì đã dành thời gian để viết kịch bản này. Nó hoạt động giống như quảng cáo cho các tập tin duy nhất. Trong số các giải pháp được đăng, đó là giải pháp duy nhất có hệ thống nhận ra đầu ra (tên tệp chính xác 48eebea785a185cdfc9d8f1a2ed34400.pngđược sử dụng). Tuy nhiên, tại thời điểm này, nó dường như không hỗ trợ các thư mục. Có cách nào bạn có thể làm cho nó đi qua các thư mục đệ quy không?
Glutimate

Làm xong. Tôi cũng đơn giản hóa đầu ra một chút quá.
James Henstridge

Kịch bản của bạn hoạt động hoàn toàn tuyệt vời. Đó chính xác là những gì tôi đang tìm kiếm, vì vậy tôi đã trao cho bạn tiền thưởng. Tôi đã gặp một số thông báo lỗi trong khi thực hiện lần chạy thử cuối cùng của mình, nhưng chúng dường như không cản trở việc tạo hình thu nhỏ. Các lỗi có thể liên quan đến thực tế là một số tên tệp bao gồm Umlauts của Đức ("ä, ü, ö"). Cảm ơn bạn, một lần nữa, đã cung cấp giải pháp tuyệt vời này. Nó sẽ làm cho cuộc sống của tôi dễ dàng hơn nhiều kể từ bây giờ.
Glutimate

1
Những lỗi đó xuất phát từ một trình phân tích cú pháp XML đang được sử dụng bởi một trong những người thu nhỏ, do đó sẽ liên quan đến nội dung của một số tệp chứ không phải tên của nó. Tập lệnh thu nhỏ ở trên sẽ xử lý tất cả các tệp trong thư mục, vì vậy nó có thể không phải là PDF mà nó đang gặp sự cố.
James Henstridge

Tôi không thể tạo hình thu nhỏ cho các tệp văn bản thuần túy. Có cái gì tôi cần cấu hình để làm cho công việc này?
krasnaya

18

Kịch bản dưới đây nên làm công việc. Nó sử dụng evince-thumbnailercái mà - theo như tôi biết - đi kèm với mọi cài đặt gnome và là hình thu nhỏ mặc định.
Lưu như pdfthumbnailer.sh và làm cho nó thực thi.
Cách sử dụng :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

Hạn chế :

  • không thêm các thuộc tính Thumb :: URI và Thumb :: MTime vào hình thu nhỏ như được chỉ ra bởi James Henstridge. Cho đến nay tôi không thấy bằng chứng nào cho thấy mặc định evince-thumbnailerđang làm như vậy. Nói cách khác, miễn là nautilus không tạo lại hình thu nhỏ, tập lệnh có thể được sử dụng cho công việc.

Ghi chú :

  • in tên tệp khi tạo hình thu nhỏ mới, bỏ qua việc tạo nếu có
  • tốc độ: 37 tệp pdf được thử nghiệm với cả hai evince-thumbnailerconvert(từ hình ảnh tưởng tượng): evince-thumbnailer3 giây trong và 14 giây cho convert.
  • tạo hình thu nhỏ được nhận ra bởi nautilus
  • tên đường dẫn được xử lý bởi URL perl: mô-đun tệp (khoảng trắng và các ký tự khác được dịch chính xác thành một tệp uri)
  • nhu cầu perl, hiện diện trong một cài đặt mặc định
  • các tệp được xử lý evince-thumbnailerđơn giản sẽ tạo ra lỗi - tắt tiếng với2>/dev/null
  • nhìn vào dòng MimeType /usr/share/thumbnailers/evince.thumbnailerđể xem danh sách các loại tệp được xử lý
  • cập nhật: bắt đầu từ 12.04 thư mục hình thu nhỏ dường như ~/.cache/thumbnails.
    Đường dẫn mạnh mẽ hơn bằng cách sử dụng readlink.

Cảm hứng :
http://bugs.debian.org/cgi-bin/orpreport.cgi?orms=683394


Trước hết cảm ơn bạn vì câu trả lời của bạn và nỗ lực bạn bỏ ra. Tôi đã thực hiện một số lần chạy thử và đây là kết quả của tôi: 1.) tạo hình thu nhỏ không hoạt động đối với các thư mục có khoảng trắng trong tên của chúng; 2.) hình thu nhỏ được tạo bằng cả tập lệnh của bạn và @Martin Orda không được hệ thống nhận ra; các tệp được xử lý với tập lệnh của bạn được xử lý như thể không có hình thu nhỏ nào -> kết quả: các ngón tay cái trùng lặp trong thư mục hình thu nhỏ
Glutanimate

Hừm, các xét nghiệm của tôi đều tích cực cho đến nay: nautilus đã nhận ra các hình thu nhỏ và không tái tạo chúng. Ugh, khoảng trắng trong tên thư mục là thứ tôi thấy không hay..nhưng tôi sẽ sửa đổi tập lệnh. Hình thu nhỏ trùng lặp? Tên của tumbnail mới cho một tập tin đưa ra là gì?
Rosch

Ok, đã thử lại lần nữa và tôi sợ đó là kết quả như lần trước. Đây là tên tệp của hình thu nhỏ mà tập lệnh của bạn đã tạo : 2a43dc2774e3dfe45a4337e0304e5b0a.png. Đây là cách hình thu nhỏ tương tự được đặt tên bởi nautilus : 48eebea785a185cdfc9d8f1a2ed34400.png. Tôi cũng đã nhận thấy rằng các ngón tay cái được tạo bằng tập lệnh của bạn là 128x171px trong khi trình thu nhỏ sẵn có chỉ tạo các hình thu nhỏ 96x128px.
Glutimate


Về nhận xét của bạn về việc evince-thumbnailerkhông thêm các thẻ PNG, điều đó là chính xác: mã gọi các hình thu nhỏ bên ngoài thực sự viết lại các hình ảnh để bao gồm các thẻ. Bạn sẽ có thể xác minh điều này bằng cách chạy strings -atrên một trong những hình thu nhỏ được tạo bởi Nautilus.
James Henstridge

10

Đã bị phân tâm một lúc và Rosch đã đánh bại tôi :) Không biết evince-Thumber tồn tại (Tôi không phải là người dùng Gnome) nhưng dù sao, vì tôi đã viết nó rồi, nó sẽ đi. Nó yêu cầu cài đặt hình ảnh, kiểm tra và cài đặt nếu không có:

which convert || sudo apt-get install imagemagick

Lưu dưới dạng mkthumb.sh(ví dụ), chmod +x mkthumb.shnó và thực thi nó với các đường dẫn tuyệt đối làm đối số (bạn có thể sử dụng -s làm tham số đầu tiên của nó để bỏ qua việc tạo các hình thu nhỏ đã tồn tại) tức là:

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
....

Tập lệnh (Tôi đã sửa đổi nó một chút để hỗ trợ hầu hết các hình ảnh, bạn có thể thêm nhiều tiện ích mở rộng nếu bạn cần chúng):

#!/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}"

Nó xử lý các tập tin với không gian trong tên của họ mà không có vấn đề.

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.

Cảm ơn bạn, cũng, vì đã cung cấp một kịch bản tuyệt vời. Tôi đã thực hiện một số lần chạy thử và đây là kết quả của tôi: 1.) thế hệ hình thu nhỏ hoạt động tốt và nhanh hơn so với evince-Thumber; 2.) hình thu nhỏ được tạo cả với tập lệnh của bạn và @ rosch's không được hệ thống nhận ra; các tệp được xử lý với tập lệnh của bạn được xử lý như thể không có hình thu nhỏ. Các ngón tay cái mới được tạo khi truy cập thủ công các thư mục -> kết quả: các ngón tay cái trùng lặp trong thư mục hình thu nhỏ
Glutanimate

Bạn nói đúng - Tôi đã kiểm tra lại lần nữa và thấy rằng nautilus tạo ra chúng một lần nữa (Tôi nghĩ đó không phải là trường hợp khi tôi kiểm tra nó đêm qua nhưng tôi có thể sai, nó đã muộn). Nếu nó thực sự nhanh hơn như bạn đã viết (tôi chưa sử dụng các phương pháp khác), tôi sẽ làm việc với nó trong vài giờ. Vấn đề duy nhất tôi tìm thấy với điều này là cả hai tệp được tạo bởi tập lệnh của tôi và nautilus thể hiện cùng một thuộc tính: "PNG 97x128 97x128 + 0 + 0 DirectClass 8-bit 20.4KB 0.000u 0: 00.000" khi tôi sử dụng nhận dạng <hình thu nhỏ>.
Marcin Kaminski

Không, cả hai chúng tôi đều sai :) Hóa ra tôi quên rằng tên tệp của hình thu nhỏ là băm md5 của 'tệp: //' + perfect_path và chạy nhầm tập lệnh của tôi là ./mkthumb.sh -s Tải xuống / pdf / test thay vì. /mkthumb.sh -s / home / user / Tải xuống / pdf / test. Hãy thử cho nó đi một lần nữa.
Marcin Kaminski

Được rồi, tôi đã thực hiện một lần chạy thử khác và điều đặc biệt là cả hai kịch bản của bạn đều có cùng một vấn đề: tên tệp với tập lệnh của bạn là 2a43dc2774e3dfe45a4337e0304e5b0a.pngtrong khi nautilus đặt tên là 48eebea785a185cdfc9d8f1a2ed34400.png. Kích thước, tuy nhiên, là chính xác với kịch bản của bạn. Dưới đây là một so sánh
Glutanimate

Tôi muốn thêm rằng kịch bản của bạn vẫn là nhanh nhất trong số các kịch bản được đăng ở đây. imagemagickdường như cũng xử lý tỷ lệ tốt hơn nhiều evince-thumbnailer(xem phần so sánh ở trên để tham khảo).
Glutimate

1

Đặc tả hình thu nhỏ bao gồm các kho lưu trữ hình thu nhỏ được chia sẻ, cho phép các hình thu nhỏ tạo trước được phân phối cùng với các tệp được liên kết thay vì mỗi người dùng tạo hình thu nhỏ của riêng họ. Vì vậy, về mặt lý thuyết, bạn có thể tạo hình thu nhỏ và sau đó thêm chúng vào kho lưu trữ được chia sẻ, do đó loại bỏ nhu cầu tạo chúng trong tương lai nếu bạn xóa thư mục hình thu nhỏ của mình hoặc chuyển tất cả chúng sang một máy khác hoặc bất cứ thứ gì.

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

Trang Ask Ubuntu này xuất hiện trong kết quả tìm kiếm khi tôi đang cố gắng tìm hiểu xem có ứng dụng nào hỗ trợ kho lưu trữ hình thu nhỏ được chia sẻ không. Đáng buồn thay, dường như không có ứng dụng hỗ trợ họ.


1

Tôi đã viết một gói sửa đổi tập lệnh của James để bao gồm đa xử lý và tùy chọn tạo đệ quy hình thu nhỏ. Gói này có thể pipcài đặt được. Kiểm tra ở đây để được hướng dẫn cài đặt.

Một ví dụ về việc sử dụng là:

thumbgen -w 4 -r -d your_directory
  • -r: đệ quy tạo hình thu nhỏ

  • -w: số lõi cần sử dụng

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.