Jak automatycznie ustawić ikony folderów dla wielu folderów?

10

Jak ustawić pierwsze zdjęcie każdego folderu jako ikonę folderu?

Powyższe pytanie zawiera odpowiedź składającą się ze skryptu, który działa dla mnie. Trzeba tylko trochę poprawić.

Co robi?

Znajduje pliki z rozszerzeniami .jpg, .jpeg, .png, .gif, .icns, .ico i ustawia je jako ikonę folderu folderu, w którym plik został znaleziony. Działa na wielu folderach rekursywnie. Zasadniczo próbuje znaleźć plik obrazu wewnątrz folderu, a pierwszy znaleziony obraz jest ustawiony jako ikona folderu. Działa świetnie w wielu scenariuszach, a konfigurowanie tego skryptu jest zwykle pierwszą rzeczą, którą robię po świeżej instalacji (ponieważ jest niesamowita).

Jaki jest problem?

Może istnieć kilka katalogów zawierających dużo plików graficznych, a pierwszy plik obrazu w tym katalogu może nie być dobrze dostosowany do ikony folderu.

Co powinien zrobić?

Zamiast opierać się na rozszerzeniu, jeśli stał się nazwą opartą na nazwie pliku i docelową (na przykład folder.png ) lub wieloma (np. albumart.png cover.png ) nazwami plików, problem ten mógł zostać rozwiązany.

lub jeszcze lepiej, aby oba podejścia działały w jednym skrypcie

  • Znajdź predefiniowany filenames
  • Jeśli znajdziesz, ustaw jako ikonę folderu i przejdź do następnego folderu
  • Jeśli NIE zostanie znalezione, znajdź predefiniowane rozszerzenie i ustaw jako ikonę folderu i przejdź do następnego folderu
zadawane Sumeet Deshmukh 06.04.2017, 14:45
źródło

1 odpowiedź

8

Może nadal "elegancko to trochę", ale poniżej są edytowane wersje połączonych.

Jaka jest różnica?

Dodałem wstępnie zdefiniowaną listę do sekcji head:

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

i zastąpiłem:

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

przez:

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

tak, że skrypt najpierw próbuje znaleźć (plik) mecze na liście specs , (tylko) jeśli nie ma, to przeskakuje do wyszukania pasującego rozszerzenia i robi lewę, jeśli znajdzie odpowiedni obraz.

1. Wersja podstawowa

Do użycia z docelowym katalogiem jako argumentem:

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

Jak korzystać

  1. Skopiuj skrypt do pustego pliku, zapisz go jako change_icon.py
  2. W nagłówku skryptu edytuj, jeśli chcesz, listę rozszerzeń, które będą używane jako prawidłowe obrazy ikon. Ustaw także preferowaną listę nazw plików.
  3. Uruchom jako docelowy katalog docelowy:

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

To wszystko!

2. Edytowana opcja prawego przycisku myszy, używana jako skrypt nautilus (prawy przycisk myszy)

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

Aby użyć

  1. Utwórz, jeśli jeszcze nie istnieje, katalog

    ~/.local/share/nautilus/scripts
    
  2. Skopiuj skrypt do pustego pliku, zapisz go w ~/.local/share/nautilus/scripts jako set_foldericons (bez rozszerzenia!) i spraw, aby był wykonywany .

  3. W nagłówku skryptu edytuj, jeśli chcesz, listę rozszerzeń, które będą używane jako prawidłowe obrazy ikon. Ustaw także preferowaną listę nazw plików.
  4. Wyloguj się i wróć, i to działa.

Jeśli z jakiegoś powodu chcesz przywrócić ikony w folderze do domyślnych ikon, użyj skryptu tutaj

    
odpowiedział Jacob Vlijm 23.05.2017, 21:52
źródło

Przeczytaj inne pytania na temat tagów