Come impostare automaticamente le icone delle cartelle di più cartelle?


10

Come impostare la prima immagine di ogni cartella come icona della cartella?

La domanda sopra collegata ha una risposta consistente in una sceneggiatura che ha funzionato per me. Ha solo bisogno di un piccolo miglioramento.

Che cosa fa?

Trova i file con estensione .jpg, .jpeg, .png, .gif, .icns, .ico e li imposta come icona della cartella in cui è stato trovato il file. Funziona su più cartelle, in modo ricorsivo. Fondamentalmente cerca di trovare un file di immagine all'interno della cartella e la prima immagine che trova viene impostata come icona di una cartella. Funziona benissimo per molti scenari e l'impostazione di questo script è di solito la prima cosa che faccio dopo una nuova installazione (perché è incredibile).

Qual è il problema?

Potrebbero esserci alcune directory che contengono molti file di immagine e il primo file di immagine in quella directory potrebbe non essere adatto per essere l'icona della cartella.

Cosa dovrebbe fare?

Invece di essere basato sull'estensione, se diventasse basato sul nome file e avesse come target uno (ad esempio folder.png) o più (ad esempio albumart.png cover.png) nomi di file, questo problema potrebbe essere risolto.

o meglio ancora far funzionare entrambi gli approcci in un singolo script

  • Trova predefinito filenames
  • Se trovato, impostalo come icona della cartella e passa alla cartella successiva
  • Se NON trovato, trova l'estensione predefinita e impostala come icona della cartella e passa alla cartella successiva

Risposte:


9

Potrei ancora "abbellirlo un po '", ma di seguito sono riportate le versioni modificate di quelle collegate.

Qual è la differenza?

Ho aggiunto un elenco predefinito alla sezione head:

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

e ho sostituito:

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

di:

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

in modo che lo script provi prima a trovare (file) corrispondenze nell'elenco specs(solo) se non ci sono, passa alla ricerca dell'estensione corrispondente e fa il trucco se trova un'immagine adatta.


1. La versione base

Da utilizzare con la directory di destinazione come argomento:

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

Come usare

  1. Copia lo script in un file vuoto, salvalo come change_icon.py
  2. Nell'intestazione dello script, modifica, se lo desideri, l'elenco delle estensioni da utilizzare come immagini icona valide. Imposta anche l'elenco preferito di nomi di file.
  3. Eseguilo con la directory di destinazione come argomento:

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

Questo è tutto!


2. L'opzione del tasto destro del mouse modificata, da utilizzare come script nautilus (tasto destro)

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

Usare

  1. Crea, se non esiste ancora, la directory

    ~/.local/share/nautilus/scripts
    
  2. Copia lo script in un file vuoto, salvalo ~/.local/share/nautilus/scriptscome set_foldericons(nessuna estensione!) E rendilo eseguibile .

  3. Nell'intestazione dello script, modifica, se lo desideri, l'elenco delle estensioni da utilizzare come immagini icona valide. Imposta anche l'elenco preferito di nomi di file.
  4. Esci e rientra e funziona.

Se, per qualche motivo, desideri reimpostare le icone all'interno di una cartella sulle loro icone predefinite, usa lo script qui


2
È necessario verificare che l'URI di Nautilus inizi effettivamente con file://. Invece di replace("%20", " ")te dovresti usare la corretta decodifica URI (es. urllib.parse.unquote) E successiva codifica ( urllib.parse.quote).
David Foerster,

@DavidFoerster migliorerà comunque le prestazioni della sceneggiatura? Ho provato a cambiare subprocess.Popena subprocess.call, ma su enormi directory con non tutte le icone delle cartelle chnage quasi 700 + di sub.
Sumeet Deshmukh,

@DavidFoerster grazie! ma urllib.parse.quotefunziona bene su un test "a secco", non nello script. Devo scoprire perché, ma per ora lasciare la versione funzionante dello script.
Jacob Vlijm,

@SumeetDeshmukh: No, ma farà funzionare lo script con URL che contengono altri caratteri "speciali" oltre al carattere spazio (U + 0020). Inoltre sarebbe più robusto contro input errati o fasulli e lo afferrerebbe presto.
David Foerster,

@JacobVlijm: cosa succede quando si tenta di utilizzarlo nello script? Messaggio di errore? Risultati inaspettati? Funziona unquotecome previsto?
David Foerster,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.