একাধিক ফোল্ডারের ফোল্ডার আইকন কীভাবে সেট করবেন?


10

প্রতিটি ফোল্ডারের প্রথম চিত্রটিকে তার ফোল্ডার আইকন হিসাবে কীভাবে সেট করবেন?

উপরে লিঙ্কিত প্রশ্নের উত্তর রয়েছে যা আমার জন্য কাজ করে যা একটি স্ক্রিপ্ট নিয়ে গঠিত। এটির জন্য একটু উন্নতি দরকার।

এটার কাজ কি?

এটি .jpg, .jpeg, .png, .gif, .icns, .ico এক্সটেনশন সহ ফাইলগুলি সন্ধান করে এবং ফাইলটি যে ফোল্ডারে পাওয়া গিয়েছিল তার ফোল্ডার আইকন হিসাবে সেট করে। এটি একাধিক ফোল্ডারে পুনরাবৃত্তভাবে কাজ করে। মূলত এটি ফোল্ডারের ভিতরে একটি চিত্র ফাইল সন্ধান করার চেষ্টা করে এবং এটি খুঁজে পাওয়া প্রথম চিত্রটি একটি ফোল্ডার আইকন হিসাবে সেট করা হয়। এটি অনেক পরিস্থিতিতে দৃশ্যের জন্য দুর্দান্ত কাজ করে এবং এই স্ক্রিপ্টটি সেটআপ করা তাজা ইনস্টল করার পরে সাধারণত আমি প্রথম কাজ করি (কারণ এটি আশ্চর্যজনক)।

সমস্যা কি?

কয়েকটি ডিরেক্টরি থাকতে পারে যেখানে প্রচুর চিত্র ফাইল রয়েছে এবং সেই ডিরেক্টরিতে প্রথম চিত্র ফাইলটি ফোল্ডার আইকন হওয়ার পক্ষে উপযুক্ত নয় not

এটা কি করা উচিত?

এক্সটেনশন ভিত্তিক হওয়ার পরিবর্তে, যদি এটি ফাইলনাম ভিত্তিক হয়ে লক্ষ্যবস্তু হয়ে যায় (উদাহরণস্বরূপ 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>
    

এটাই!


২. সম্পাদিত রাইট-ক্লিক বিকল্পটি, নটিলাস (ডান-ক্লিক) স্ক্রিপ্ট হিসাবে ব্যবহার করার জন্য

#!/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
আপনার যাচাই করা উচিত যে নটিলাস থেকে ইউআরআই আসলে শুরু হয়েছিল file://। পরিবর্তে replace("%20", " ")আপনার যথাযথ ইউআরআই ডিকোডিং (উদাহরণস্বরূপ urllib.parse.unquote) এবং পরে এনকোডিং ( urllib.parse.quote) ব্যবহার করা উচিত ।
ডেভিড ফোরস্টার

@ ডেভিডফোস্টার এইভাবেই কি স্ক্রিপ্টটির পারফরম্যান্স উন্নত করতে পারে? আমি প্রায় 700+ সাব সমস্ত ফোল্ডার আইকন চেনেজ নয় এমন বিশাল ডিরেক্টরিতে পরিবর্তন subprocess.Popenকরার চেষ্টা subprocess.callকরেছি।
সুমিত দেশমুখ

@ ডেভিডফোরস্টার ধন্যবাদ! তবে urllib.parse.quoteস্ক্রিপ্টে নয়, "শুকনো" পরীক্ষায় ভাল কাজ করে। কেন তা খুঁজে পাওয়া দরকার, তবে আপাতত স্ক্রিপ্টের ওয়ার্কিং সংস্করণ রেখে চলেছেন।
জ্যাকব Vlijm

@ সুমেটদেশমুখ: না, তবে এটি স্ক্রিপ্টটি ইউআরএলগুলির সাথে কাজ করবে যা স্পেস অক্ষরের (ইউ + 0020) বাদে অন্যান্য "বিশেষ" অক্ষর ধারণ করে। তদাতিরিক্ত এটি ভুল বা বগাস ইনপুটটির বিরুদ্ধে আরও দৃ .় হবে এবং তাড়াতাড়ি ধরা পড়বে।
ডেভিড ফোরস্টার

@ জ্যাকবভিলিজম: আপনি যখন স্ক্রিপ্টে এটি ব্যবহার করার চেষ্টা করবেন তখন কি হবে? ভুল বার্তা? অপ্রত্যাশিত ফলাফল? কি unquoteআশানুরূপ কাজ করে?
ডেভিড ফোরস্টার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.