स्वचालित रूप से कई फ़ोल्डरों के फ़ोल्डर आइकन कैसे सेट करें?


10

हर फोल्डर की पहली तस्वीर को उसके फोल्डर आइकन के रूप में कैसे सेट करें?

ऊपर दिए गए प्रश्न में एक उत्तर है जिसमें एक स्क्रिप्ट शामिल है जो मेरे लिए काम कर रही है। इसमें बस थोड़े सुधार की जरूरत है।

यह क्या करता है?

यह .jpg, .jpeg, .png, .gif, .icns, .ico एक्सटेंशन के साथ फाइलें पाता है और उन्हें उस फ़ोल्डर के आइकन आइकन के रूप में सेट करता है जिसमें फ़ाइल मिली थी। यह कई फ़ोल्डरों पर, पुनरावर्ती रूप से काम करता है। मूल रूप से यह फ़ोल्डर के अंदर एक छवि फ़ाइल खोजने की कोशिश करता है, और पहली छवि जो इसे ढूंढता है वह फ़ोल्डर आइकन के रूप में सेट है। यह कई परिदृश्यों के लिए बहुत अच्छा काम करता है, और इस स्क्रिप्ट को स्थापित करना आमतौर पर पहली चीज है जो मैं ताजा स्थापित करने के बाद करता हूं (क्योंकि यह आश्चर्यजनक है)।

समस्या क्या है?

कुछ निर्देशिकाएं हो सकती हैं जिनमें बहुत सारी छवि फाइलें होती हैं और उस निर्देशिका में पहली छवि फ़ाइल फ़ोल्डर आइकन होने के लिए अच्छी तरह से अनुकूल नहीं हो सकती है।

इसे क्या करना चाहिए?

विस्तार आधारित होने के बजाय, यदि यह फ़ाइल नाम आधारित और लक्षित हो गया (उदाहरण के लिए, folder.png) या एकाधिक (जैसे albumart.png cover.png) फ़ाइल नाम, तो यह समस्या हल हो सकती है।

या बेहतर अभी तक एक ही स्क्रिप्ट में दोनों दृष्टिकोण काम करते हैं

  • पूर्वनिर्धारित खोजें filenames
  • यदि इसे फ़ोल्डर आइकन के रूप में सेट किया गया और अगले फ़ोल्डर में ले जाएं
  • यदि नहीं मिला है, तो पूर्वनिर्धारित एक्सटेंशन ढूंढें और इसे फ़ोल्डर आइकन के रूप में सेट करें और अगले फ़ोल्डर पर जाएं

जवाबों:


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. संपादित राइट-क्लिक विकल्प, एक नॉटिलस (राइट-क्लिक) स्क्रिप्ट के रूप में उपयोग करने के लिए

#!/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
आपको यह सत्यापित करना चाहिए कि Nautilus से URI वास्तव में शुरू होता है file://। इसके बजाय replace("%20", " ")आपको उचित यूआरआई डिकोडिंग (जैसे urllib.parse.unquote) और बाद में एन्कोडिंग ( urllib.parse.quote) का उपयोग करना चाहिए ।
डेविड फ़ॉस्टर

@DavidFoerster यह स्क्रिप्ट के प्रदर्शन को बेहतर बनाने वाला है? मैं बदलने की कोशिश की subprocess.Popenकरने के लिए subprocess.callलगभग 700 + उप के सभी फ़ोल्डर प्रतीक chnage साथ, लेकिन इसे भरपूर निर्देशिकाओं पर।
सुमीत देशमुख

@DavidFoerster धन्यवाद! लेकिन urllib.parse.quoteएक "सूखी" परीक्षण पर ठीक काम करता है, स्क्रिप्ट में नहीं। पता लगाने की आवश्यकता क्यों है, लेकिन अभी के लिए स्क्रिप्ट के काम करने वाले संस्करण को छोड़कर।
जैकब व्लिजम

@SumeetDeshmukh: नहीं, लेकिन यह उन URL के साथ स्क्रिप्ट का काम करने जा रहा है जिसमें अंतरिक्ष वर्ण (U + 0020) के अलग "अन्य" विशेष अक्षर होते हैं। इसके अतिरिक्त यह गलत या फर्जी इनपुट के खिलाफ अधिक मजबूत होगा और इसे जल्दी पकड़ लेगा।
डेविड फ़ॉस्टर

@JacobVlijm: जब आप इसे स्क्रिप्ट में उपयोग करने का प्रयास करते हैं तो क्या होता है? त्रुटि संदेश? अप्रत्याशित परिणाम? unquoteउम्मीद के मुताबिक काम करता है?
डेविड फ़ॉस्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.