web-dev-qa-db-fra.com

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

S'il y a des images dans le dossier A, B, C ..... Z, comment définir automatiquement la première image de chacun de ces dossiers comme son icône de dossier? Y a-t-il un moyen comme un script ou autre chose?

19
JulianLai

1. Changer automatiquement l'icône du dossier en la première image trouvée à l'intérieur

Le script python ci-dessous modifie l'icône (de manière récursive) de tous les dossiers d'un répertoire en le premier fichier image trouvé valide du dossier.

Le scénario

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

dr = sys.argv[1]

for root, dirs, files in os.walk(dr):
    for directory in dirs:
        folder = os.path.join(root, directory)
        try:
            first = min(p for p in os.listdir(folder) 
                        if p.split(".")[-1].lower() in ext)
        except ValueError:
            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))
                  ])

Télécharger à partir de Pastebin

Comment utiliser

  1. Copiez le script dans un fichier vide, enregistrez-le sous 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.
  3. Exécutez-le avec le répertoire ciblé comme argument:

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

C'est tout!

2. Plus avancé

... consiste à en faire un clic droit dans Nautilus:

enter image description here

Le script est légèrement différent alors:

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

# retrieve the path of the targeted folder
current = os.getenv("NAUTILUS_SCRIPT_CURRENT_URI").replace("file://", "").replace("%20", " ")
dr = os.path.realpath(current)

for root, dirs, files in os.walk(dr):
    for directory in dirs:
        folder = os.path.join(root, directory)
        try:
            first = min(p for p in os.listdir(folder) 
                        if p.split(".")[-1].lower() in ext)
        except ValueError:
            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))
                  ])

Télécharger à partir de Pastebin

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 sous le nom set_foldericons (sans extension!) Et pour le rendre exécutable .

  3. Déconnectez-vous et revenez, cela fonctionne.

Remarques

  • Cela changera l'icône de tous les dossiers à l'intérieur du dossier sur lequel vous avez cliqué avec le bouton droit de la souris, pas du dossier lui-même.
  • Étant donné que os.path.realpath() est utilisé, cela fonctionne également si le dossier ciblé est un lien.

MODIFIER

Annuler (réinitialiser) les icônes personnalisées dans un répertoire de manière récursive

Si, pour une raison quelconque, vous souhaitez rétablir les icônes par défaut des icônes d’un dossier, utilisez le script ci-dessous. Simplement:

  • copiez-le dans un fichier vide, enregistrez-le sous reset_icons.py
  • lancez le par la commande:

    python3 /path/to/reset_icons.py <target_directory>
    

Le scénario

#!/usr/bin/env python3
import subprocess
import os
import sys

dr = sys.argv[1]

for root, dirs, files in os.walk(dr):
    for directory in dirs:
        folder = os.path.join(root, directory)
        subprocess.Popen([
            "gvfs-set-attribute", os.path.abspath(folder),
            "-t", "unset", "metadata::custom-icon"
            ])
28
Jacob Vlijm