Làm cách nào để đặt biểu tượng thư mục của nhiều thư mục tự động?


10

Làm cách nào để đặt hình ảnh đầu tiên của mỗi thư mục làm biểu tượng thư mục của nó?

Câu hỏi được liên kết ở trên có một câu trả lời bao gồm một kịch bản đang làm việc cho tôi. Nó chỉ cần một chút cải tiến.

Nó làm gì?

Nó tìm thấy các tệp có phần mở rộng .jpg, .jpeg, .png, .gif, .icns, .ico và đặt chúng làm biểu tượng thư mục của thư mục chứa tệp. Nó hoạt động trên nhiều thư mục, đệ quy. Về cơ bản, nó cố gắng tìm một tệp hình ảnh trong thư mục và hình ảnh đầu tiên mà nó tìm thấy được đặt làm biểu tượng thư mục. Nó hoạt động tuyệt vời cho nhiều kịch bản và thiết lập tập lệnh này thường là điều đầu tiên tôi làm sau khi cài đặt mới (vì nó tuyệt vời).

Có vấn đề gì vậy?

Có thể có một vài thư mục chứa rất nhiều tệp hình ảnh và tệp hình ảnh đầu tiên trong thư mục đó có thể không phù hợp để trở thành biểu tượng thư mục.

Nó nên làm gì?

Thay vì dựa trên tiện ích mở rộng, nếu nó trở thành tên tệp dựa trên và nhắm mục tiêu (ví dụ folder.png:) hoặc nhiều albumart.png cover.pngtên tệp (ví dụ ) thì vấn đề này có thể được giải quyết.

hoặc tốt hơn là làm cho cả hai cách tiếp cận hoạt động trong một tập lệnh

  • Tìm được xác định trước filenames
  • Nếu tìm thấy, đặt nó làm biểu tượng thư mục và chuyển sang thư mục tiếp theo
  • Nếu KHÔNG tìm thấy thì tìm phần mở rộng được xác định trước và đặt nó làm biểu tượng thư mục và chuyển sang thư mục tiếp theo

Câu trả lời:


9

Tôi vẫn có thể "tao nhã một chút" nhưng dưới đây là các phiên bản chỉnh sửa của những cái được liên kết.

Sự khác biệt là gì?

Tôi đã thêm một danh sách được xác định trước vào phần đầu:

specs = ["folder.png", "cover.png", "monkey.png"]

và tôi đã thay thế:

try:
    first = min(p for p in os.listdir(folder) 
                if p.split(".")[-1].lower() in ext)
except ValueError:
    pass

bởi:

fls = os.listdir(folder)
try:
    first = [p for p in fls if p in specs]
    first = first[0] if first else min(
        p for p in fls if p.split(".")[-1].lower() in ext
        )
except ValueError:
    pass

để trước tiên tập lệnh cố gắng tìm (tập tin) khớp trong danh sách specs, (chỉ) nếu không có, nó sẽ nhảy vào tìm kiếm phần mở rộng phù hợp và thực hiện thủ thuật nếu tìm thấy hình ảnh phù hợp.


1. Phiên bản cơ bản

Được sử dụng với thư mục được nhắm mục tiêu làm đối số:

#!/usr/bin/env python3
import subprocess
import os
import sys

# --- set the list of valid extensions below (lowercase)
# --- use quotes, *don't* include the dot!
ext = ["jpg", "jpeg", "png", "gif", "icns", "ico"]
# --- set the list of preferred filenames
# --- use quotes
specs = ["folder.png", "cover.png", "monkey.png"]
# ---

# retrieve the path of the targeted folder
dr = sys.argv[1]

for root, dirs, files in os.walk(dr):
    for directory in dirs:
        folder = os.path.join(root, directory)
        try:
            fls = os.listdir(folder)
            first = [p for p in fls if p in specs]
            first = first[0] if first else min(
                p for p in fls if p.split(".")[-1].lower() in ext
                )
        except (ValueError, PermissionError):
            pass

        else:
            subprocess.Popen([
                "gvfs-set-attribute", "-t", "string",
                os.path.abspath(folder), "metadata::custom-icon",
                "file://"+os.path.abspath(os.path.join(folder, first))
                ])

Cách sử dụng

  1. Sao chép tập lệnh vào một tập tin trống, lưu nó dưới dạng change_icon.py
  2. Trong phần đầu của tập lệnh, hãy chỉnh sửa, nếu bạn muốn, danh sách các phần mở rộng sẽ được sử dụng làm hình ảnh biểu tượng hợp lệ. Cũng thiết lập danh sách tên tập tin ưa thích.
  3. Chạy nó với thư mục được nhắm mục tiêu như là một đối số:

    python3 /path/to/change_icon.py <targeted_directory>
    

Đó là nó!


2. Tùy chọn nhấp chuột phải được chỉnh sửa, được sử dụng làm tập lệnh nautilus (nhấp chuột phải)

#!/usr/bin/env python3
import subprocess
import os

# --- set the list of valid extensions below (lowercase)
# --- use quotes, *don't* include the dot!
ext = ["jpg", "jpeg", "png", "gif", "icns", "ico"]
# --- set the list of preferred filenames
# --- use quotes
specs = ["folder.png", "cover.png", "aap.png"]
# ---

def fix(path):
    for c in [("%23", "#"), ("%5D", "]"), ("%5E", "^"),
              ("file://", ""), ("%20", " ")]:
        path = path.replace(c[0], c[1])
    return path

# retrieve the path of the targeted folder
current = fix(os.getenv("NAUTILUS_SCRIPT_CURRENT_URI"))
dr = os.path.realpath(current)

for root, dirs, files in os.walk(dr):
    for directory in dirs:
        folder = os.path.join(root, directory)
        try:
            fls = os.listdir(folder)
            first = [p for p in fls if p in specs]
            first = first[0] if first else min(
                p for p in fls if p.split(".")[-1].lower() in ext
                )
        except (ValueError, PermissionError):
            pass

        else:
            subprocess.Popen([
                "gvfs-set-attribute", "-t", "string",
                os.path.abspath(folder), "metadata::custom-icon",
                "file://"+os.path.abspath(os.path.join(folder, first))
                ])

Để sử dụng

  1. Tạo, nếu nó chưa tồn tại, thư mục

    ~/.local/share/nautilus/scripts
    
  2. Sao chép tập lệnh vào một tệp trống, lưu nó ~/.local/share/nautilus/scriptsdưới dạng set_foldericons(không có phần mở rộng!) Và làm cho nó có thể thực thi được .

  3. Trong phần đầu của tập lệnh, hãy chỉnh sửa, nếu bạn muốn, danh sách các phần mở rộng sẽ được sử dụng làm hình ảnh biểu tượng hợp lệ. Cũng thiết lập danh sách tên tập tin ưa thích.
  4. Đăng xuất và đăng nhập trở lại, và nó hoạt động.

Nếu, vì một số lý do, bạn muốn đặt lại các biểu tượng trong thư mục thành (các) biểu tượng mặc định của chúng, hãy sử dụng tập lệnh tại đây


2
Bạn nên xác minh rằng URI từ Nautilus thực sự bắt đầu bằng file://. Thay vì replace("%20", " ")bạn nên sử dụng giải mã URI thích hợp (ví dụ urllib.parse.unquote) và mã hóa sau ( urllib.parse.quote).
David Foerster

@DavidFoerster điều này sẽ cải thiện hiệu suất của kịch bản chứ? Tôi đã cố gắng thay đổi subprocess.Popenthành subprocess.callnhưng trên các thư mục lớn với gần 700+ phụ không phải tất cả các biểu tượng thư mục.
Sumeet Deshmukh

@DavidFoerster cảm ơn! nhưng urllib.parse.quotehoạt động tốt trong bài kiểm tra "khô", không có trong kịch bản. Cần tìm hiểu lý do tại sao, nhưng để lại phiên bản làm việc của kịch bản bây giờ.
Jacob Vlijm

@SumeetDeshmukh: Không, nhưng nó sẽ làm cho tập lệnh hoạt động với các URL chứa các ký tự "đặc biệt" khác ngoài ký tự khoảng trắng (U + 0020). Ngoài ra, nó sẽ trở nên mạnh mẽ hơn chống lại đầu vào nhầm lẫn hoặc không có thật và bắt nó sớm.
David Foerster

@JacobVlijm: Điều gì xảy ra khi bạn cố gắng sử dụng nó trong kịch bản? Thông báo lỗi? Kết quả bất ngờ? Có unquotelàm việc như mong đợi không?
David Foerster
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.