Birden çok klasörün klasör simgeleri otomatik olarak nasıl ayarlanır?


10

Her klasörün ilk resmi klasör simgesi olarak nasıl ayarlanır?

Yukarıda bağlantılı olan sorunun benim için çalışan bir senaryo içeren bir cevabı var. Sadece biraz iyileştirilmesi gerekiyor.

Bu ne işe yarıyor?

.Jpg, .jpeg, .png, .gif, .icns, .ico uzantılarına sahip dosyaları bulur ve bunları dosyanın bulunduğu klasörün klasör simgesi olarak ayarlar. Birden çok klasörde, özyinelemeli olarak çalışır. Temel olarak klasörün içinde bir görüntü dosyası bulmaya çalışır ve bulduğu ilk görüntü bir klasör simgesi olarak ayarlanır. Birçok senaryo için harika çalışıyor ve bu komut dosyasını ayarlamak genellikle yeni kurulumdan sonra yaptığım ilk şeydir (çünkü şaşırtıcı).

Sorun ne?

Çok sayıda resim dosyası içeren birkaç dizin olabilir ve bu dizindeki ilk resim dosyası klasör simgesi olarak uygun olmayabilir.

Ne yapmalı?

Uzantı tabanlı olmak yerine, dosya adı tabanlı ve bir (örneğin folder.png) veya birden çok (örn. albumart.png cover.png) Dosya adını hedefliyorsa, bu sorun çözülebilir.

ya da daha iyisi, her iki yaklaşımın da tek bir senaryoda çalışmasını sağlayın

  • Önceden tanımlanmış bul filenames
  • Eğer bulunursa, klasör simgesi olarak ayarlayın ve bir sonraki klasöre geçin
  • Bulunamazsa, önceden tanımlanmış uzantıyı bulun ve klasör simgesi olarak ayarlayın ve sonraki klasöre geçin

Yanıtlar:


9

Hala "biraz şık" olabilir ama aşağıda bağlantılı olanların düzenlenmiş sürümleri.

Fark ne?

Baş bölümüne önceden tanımlanmış bir liste ekledim:

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

ve ben değiştirdim:

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

tarafından:

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

betiğin önce listede (dosya) eşleşmelerini bulmaya çalışması specs, (yalnızca) yoksa, eşleşen uzantıyı aramaya atlar ve uygun bir görüntü bulursa hile yapar.


1. Temel sürüm

Hedeflenen dizinde bağımsız değişken olarak kullanılacak:

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

Nasıl kullanılır

  1. Komut dosyasını boş bir dosyaya kopyalayın, change_icon.py
  2. Komut dosyasının başında, isterseniz, geçerli simge resimleri olarak kullanılacak uzantıların listesini düzenleyin. Ayrıca tercih edilen dosya adları listesini de ayarlayın.
  3. Bağımsız değişken olarak hedeflenen dizinde çalıştırın:

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

Bu kadar!


2. Nautilus (sağ tıklama) komut dosyası olarak kullanılacak düzenlenmiş sağ tıklama seçeneğ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))
                ])

Kullanmak

  1. Henüz yoksa dizini oluşturun

    ~/.local/share/nautilus/scripts
    
  2. Komut dosyasını boş bir dosyaya kopyalayın, (uzantı yok!) ~/.local/share/nautilus/scriptsOlarak kaydedin set_foldericonsve yürütülebilir yapın .

  3. Komut dosyasının başında, isterseniz, geçerli simge resimleri olarak kullanılacak uzantıların listesini düzenleyin. Ayrıca tercih edilen dosya adları listesini de ayarlayın.
  4. Oturumu kapatıp tekrar açın, işe yarıyor.

Herhangi bir nedenle bir klasör içindeki simgeleri varsayılan simgelerine sıfırlamak istiyorsanız, komut dosyasını burada kullanın


2
Nautilus URI'sinin aslında ile başladığını doğrulamalısınız file://. Bunun yerine replace("%20", " ")uygun URI kod çözme (örn. urllib.parse.unquote) Ve daha sonra kodlama ( urllib.parse.quote) kullanmalısınız.
David Foerster

@DavidFoerster bu betiğin performansını artıracak mı zaten? Ben neredeyse 700 + alt tüm klasör simgeleri chnage değil ile büyük dizinlerde değiştirmek subprocess.Popeniçin çalıştı subprocess.call.
Sümer Deshmukh

@DavidFoerster teşekkürler! ancak urllib.parse.quotesenaryoda değil, "kuru" bir testte iyi çalışır. Nedenini bulmak gerekiyor, ama şimdilik komut dosyasının çalışma sürümünü terk.
Jacob Vlijm

@SumeetDeshmukh: Hayır, ancak komut dosyasının boşluk karakterinin (U + 0020) dışında "özel" karakterler içeren URL'lerle çalışmasını sağlayacak. Ek olarak, yanlış veya sahte girişlere karşı daha sağlam hale gelir ve erken yakalar.
David Foerster

@JacobVlijm: Senaryoda kullanmaya çalıştığınızda ne olur? Hata mesajı? Beklenmedik sonuçlar? unquoteBeklendiği gibi çalışıyor mu ?
David Foerster
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.