web-dev-qa-db-fra.com

Comment définir automatiquement les icônes de dossier de plusieurs dossiers?

Comment définir la première image de chaque dossier comme son icône de dossier?

La question liée ci-dessus a une réponse consistant en un script qui a fonctionné pour moi. Cela nécessite juste une petite amélioration.

Qu'est ce que ça fait?

Il trouve des fichiers avec les extensions .jpg, .jpeg, .png, .gif, .icns, .ico et les définit comme l'icône de dossier du dossier. dans lequel le fichier a été trouvé. Cela fonctionne sur plusieurs dossiers, de manière récursive. En gros, il essaie de trouver un fichier image dans le dossier et la première image trouvée est définie comme une icône de dossier. Cela fonctionne très bien dans de nombreux scénarios et la configuration de ce script est généralement la première chose à faire après une nouvelle installation (car elle est incroyable).

Quel est le problème?

Il peut y avoir quelques répertoires contenant un grand nombre de fichiers image et le premier fichier image de ce répertoire peut ne pas convenir à l'icône de dossier.

Que devrait-il faire?

Au lieu d'être basé sur une extension, s'il devenait un nom de fichier et ciblé (par exemple, folder.png) ou plusieurs (par exemple, albumart.pngcover.png) noms de fichiers, ce problème pourrait être résolu.

ou mieux encore, faire en sorte que les deux approches fonctionnent en un seul script

  • Trouver le _ prédéfini filenames
  • Si trouvé, définissez-le comme icône de dossier et passez au dossier suivant
  • Si NON trouvé, recherchez l'extension prédéfinie, définissez-la comme icône de dossier et passez au dossier suivant.
10
Sumeet Deshmukh

Je pourrais encore "l'éléger un peu" mais ci-dessous sont les versions éditées de celles liées.

Quelle est la différence?

J'ai ajouté une liste prédéfinie à la section head:

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

et j'ai remplacé:

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

par:

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

de sorte que le script essaie d'abord de trouver les correspondances (fichier) dans la liste specs, (uniquement) s'il n'y en a pas, il passe à la recherche de l'extension correspondante et fait le tour s'il trouve une image appropriée.


1. La version de base

A utiliser avec le répertoire ciblé en argument:

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

Comment utiliser

  1. Copiez le script dans un fichier vide, enregistrez-le sous le nom change_icon.py
  2. Dans l'en-tête du script, éditez, si vous le souhaitez, la liste des extensions à utiliser comme images d'icônes valides. Définissez également la liste préférée des noms de fichiers.
  3. Exécutez-le avec le répertoire ciblé comme argument:

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

C'est ça!


2. Option de clic droit modifiée, à utiliser comme script Nautilus (clic droit)

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

Utiliser

  1. Créer, s'il n'existe pas encore, le répertoire

    ~/.local/share/nautilus/scripts
    
  2. Copiez le script dans un fichier vide, enregistrez-le dans ~/.local/share/nautilus/scripts en tant que set_foldericons (sans extension!) Et rendez-le exécutable . .

  3. Dans l'en-tête du script, éditez, si vous le souhaitez, la liste des extensions à utiliser comme images d'icônes valides. Définissez également la liste préférée des noms de fichiers.
  4. Déconnectez-vous et revenez, et cela fonctionne.

Si, pour une raison quelconque, vous souhaitez rétablir les icônes par défaut des icônes d’un dossier, utilisez le script ici

8
Jacob Vlijm