วิธีการตั้งค่าไอคอนโฟลเดอร์ของหลาย ๆ โฟลเดอร์โดยอัตโนมัติ


10

วิธีการตั้งค่าภาพแรกของทุก ๆ โฟลเดอร์เป็นไอคอนของโฟลเดอร์

คำถามที่เชื่อมโยงด้านบนมีคำตอบที่ประกอบด้วยสคริปต์ที่ทำงานให้ฉัน มันแค่ต้องการการปรับปรุงเล็กน้อย

มันทำอะไร?

พบไฟล์ที่มี. jpg, .jpeg, .png, .gif, .icns, .icoส่วนขยายและตั้งค่าเป็นไอคอนโฟลเดอร์ของโฟลเดอร์ที่พบไฟล์ มันทำงานได้หลายโฟลเดอร์ซ้ำ โดยทั่วไปจะพยายามค้นหาไฟล์ภาพภายในโฟลเดอร์และภาพแรกที่พบจะถูกตั้งเป็นไอคอนโฟลเดอร์ มันใช้งานได้ดีในหลาย ๆ สถานการณ์และการตั้งค่าสคริปต์นี้มักเป็นสิ่งแรกที่ฉันทำหลังจากติดตั้งใหม่ (เพราะมันน่าทึ่ง)

มีปัญหาอะไร?

อาจมีบางไดเรกทอรีที่มีไฟล์รูปภาพจำนวนมากและไฟล์รูปภาพแรกในไดเรกทอรีนั้นอาจไม่เหมาะกับการเป็นไอคอนโฟลเดอร์

มันควรทำอย่างไร?

แทนที่จะเป็นส่วนขยายตามถ้าเป็นชื่อไฟล์ตามและกำหนดเป้าหมายหนึ่ง (ตัวอย่างเช่นfolder.png) หรือalbumart.png cover.pngชื่อไฟล์หลายชื่อ (เช่น) ปัญหานี้จะสามารถแก้ไขได้

หรือดีกว่ายังทำให้ทั้งสองวิธีทำงานในบทเดียว

  • ค้นหาที่กำหนดไว้ล่วงหน้า filenames
  • หากพบว่าตั้งเป็นไอคอนโฟลเดอร์และย้ายไปที่โฟลเดอร์ถัดไป
  • หากไม่พบให้ค้นหาส่วนขยายที่กำหนดไว้ล่วงหน้าแล้วตั้งเป็นไอคอนโฟลเดอร์แล้วย้ายไปยังโฟลเดอร์ถัดไป

ขอให้เรายังคงอภิปรายนี้ในการแชท
Sumeet Deshmukh

คำตอบ:


9

ฉันอาจยัง "ทำให้ดีขึ้นเล็กน้อย" แต่ด้านล่างนี้เป็นเวอร์ชั่นที่แก้ไขแล้วของลิงค์ที่เชื่อมโยง

อะไรคือความแตกต่าง?

ฉันเพิ่มรายการที่กำหนดไว้ล่วงหน้าในส่วนหัว:

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

และฉันแทนที่:

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

โดย:

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

เพื่อให้สคริปต์พยายามค้นหา (ไฟล์) ที่ตรงกันในรายการเป็นครั้งแรกspecs(เท่านั้น) หากไม่มีมันจะข้ามไปเพื่อค้นหาส่วนขยายที่ตรงกันและทำการหลอกลวงหากพบรูปภาพที่เหมาะสม


1. รุ่นพื้นฐาน

เพื่อใช้กับไดเรกทอรีเป้าหมายเป็นอาร์กิวเมนต์:

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

วิธีใช้

  1. คัดลอกสคริปต์ลงในไฟล์เปล่าบันทึกเป็น change_icon.py
  2. ในส่วนหัวของสคริปต์ให้แก้ไขหากคุณต้องการรายการส่วนขยายที่จะใช้เป็นรูปภาพไอคอนที่ถูกต้อง ตั้งค่ารายการชื่อไฟล์ที่ต้องการ
  3. เรียกใช้ด้วยไดเรกทอรีเป้าหมายเป็นอาร์กิวเมนต์:

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

แค่นั้นแหละ!


2. ตัวเลือกคลิกขวาที่แก้ไขเพื่อใช้เป็นสคริปต์ nautilus (คลิกขวา)

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

ใช้

  1. สร้างถ้ามันยังไม่มีไดเรกทอรี

    ~/.local/share/nautilus/scripts
    
  2. คัดลอกสคริปต์ไปยังไฟล์ที่ว่างเปล่าบันทึก~/.local/share/nautilus/scriptsเป็นset_foldericons(ไม่มีส่วนขยาย!) และทำให้สามารถเรียกใช้งานได้

  3. ในส่วนหัวของสคริปต์ให้แก้ไขหากคุณต้องการรายการส่วนขยายที่จะใช้เป็นรูปภาพไอคอนที่ถูกต้อง ตั้งค่ารายการชื่อไฟล์ที่ต้องการ
  4. ออกจากระบบและกลับมาใหม่และใช้งานได้

หากด้วยเหตุผลบางประการที่คุณต้องการรีเซ็ตไอคอนภายในโฟลเดอร์เป็นไอคอนเริ่มต้นให้ใช้สคริปต์ที่นี่


2
คุณควรตรวจสอบว่า URI จาก Nautilus file://จริงเริ่มต้นด้วย แทนการreplace("%20", " ")ที่คุณควรใช้ที่เหมาะสม URI ถอดรหัส (เช่นurllib.parse.unquote) และต่อมาการเข้ารหัส ( urllib.parse.quote)
David Foerster

@DavidFoerster นี่จะปรับปรุงประสิทธิภาพของสคริปต์หรือไม่? ฉันพยายามที่จะเปลี่ยนsubprocess.Popenเป็นsubprocess.callแต่ในไดเรกทอรีขนาดใหญ่ที่มีเกือบ 700+ ย่อยไม่ได้เป็นไอคอนโฟลเดอร์ทั้งหมด chnage
Sumeet Deshmukh

@DavidFoerster ขอบคุณ! แต่ใช้urllib.parse.quoteงานได้ดีกับการทดสอบ "แห้ง" ไม่ใช่ในสคริปต์ ต้องการทราบสาเหตุ แต่ออกจากสคริปต์เวอร์ชันใช้งานได้ในตอนนี้
Jacob Vlijm

@SumeetDeshmukh: ไม่ แต่มันจะทำให้สคริปต์ทำงานกับ URL ที่มีอักขระ "พิเศษ" อื่น ๆ นอกเหนือจากอักขระช่องว่าง (U + 0020) นอกจากนี้มันจะมีประสิทธิภาพมากขึ้นเมื่อเทียบกับการป้อนข้อมูลที่ผิดหรือปลอมและจับมันเร็วขึ้น
David Foerster

@JacobVlijm: เกิดอะไรขึ้นเมื่อคุณพยายามใช้มันในสคริปต์? ข้อความผิดพลาด? ผลลัพธ์ที่ไม่คาดคิด? ไม่unquoteทำงานตามที่คาดไว้?
David Foerster
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.