¿Cómo configurar los iconos de carpetas de varias carpetas automáticamente?

10

¿Cómo configurar la primera imagen de cada carpeta como su icono de carpeta?

La pregunta vinculada anteriormente tiene una respuesta que consiste en un script que ha estado funcionando para mí. Solo necesita una pequeña mejora.

¿Qué hace?

Encuentra archivos con extensiones .jpg, .jpeg, .png, .gif, .icns, .ico y los establece como el icono de carpeta de la carpeta en la que se encontró el archivo. Funciona en múltiples carpetas, de forma recursiva. Básicamente trata de encontrar un archivo de imagen dentro de la carpeta, y la primera imagen que encuentra se configura como un icono de carpeta. Funciona muy bien para muchos escenarios, y configurar este script generalmente es lo primero que hago después de una nueva instalación (porque es increíble).

¿Cuál es el problema?

Puede haber algunos directorios que contengan muchos archivos de imagen y el primer archivo de imagen en ese directorio podría no ser el adecuado para ser el ícono de la carpeta.

Que debe hacer

En lugar de estar basado en la extensión, si se convirtió en un nombre de archivo y se dirigió a uno (por ejemplo folder.png) o múltiples (por ejemplo albumart.png cover.png) nombres de archivo, entonces este problema podría resolverse.

o mejor aún, hacer que ambos enfoques funcionen en un solo script

  • Encuentra predefinido filenames
  • Si lo encuentra, configúrelo como icono de carpeta y vaya a la siguiente carpeta
  • Si NO se encuentra, busque la extensión predefinida y configúrela como ícono de carpeta y vaya a la siguiente carpeta
Sumeet Deshmukh
fuente
Continuemos esta discusión en el chat .
Sumeet Deshmukh

Respuestas:

9

Todavía podría "darle un poco de elegancia", pero a continuación se encuentran las versiones editadas de las vinculadas.

¿Cuál es la diferencia?

Agregué una lista predefinida a la sección principal:

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

y reemplacé:

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

por:

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

para que el script primero intente encontrar (archivo) coincidencias en la lista specs, (solo) si no hay, salta a buscar una extensión coincidente y hace el truco si encuentra una imagen adecuada.


1. La versión básica

Para ser utilizado con el directorio de destino como argumento:

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

Cómo utilizar

  1. Copie el script en un archivo vacío, guárdelo como change_icon.py
  2. En el encabezado del guión, edite, si lo desea, la lista de extensiones que se utilizarán como imágenes de iconos válidas. Establezca también la lista preferida de nombres de archivo.
  3. Ejecútelo con el directorio de destino como argumento:

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

¡Eso es!


2. La opción editada de hacer clic con el botón derecho, que se utilizará como secuencia de comandos nautilus (clic con el botón derecho)

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

Usar

  1. Cree, si aún no existe, el directorio

    ~/.local/share/nautilus/scripts
    
  2. Copie el script en un archivo vacío, guárdelo ~/.local/share/nautilus/scriptscomo set_foldericons(¡sin extensión!) Y hágalo ejecutable .

  3. En el encabezado del guión, edite, si lo desea, la lista de extensiones que se utilizarán como imágenes de iconos válidas. Establezca también la lista preferida de nombres de archivo.
  4. Salga y vuelva a ingresar, y funciona.

Si, por algún motivo, desea restablecer los iconos dentro de una carpeta a sus iconos predeterminados, use el script aquí

Jacob Vlijm
fuente
2
Debe verificar que el URI de Nautilus realmente comience con file://. En lugar de replace("%20", " ")usar la decodificación URI adecuada (p urllib.parse.unquote. Ej. ) Y la codificación posterior ( urllib.parse.quote).
David Foerster
@DavidFoerster, ¿esto mejorará el rendimiento del script? He intentado cambiar subprocess.Popena subprocess.call, pero en grandes directorios con casi 700 + compartimento no todos los iconos de carpetas chnage.
Sumeet Deshmukh
@DavidFoerster gracias! pero urllib.parse.quotefunciona bien en una prueba "en seco", no en el script. Necesito averiguar por qué, pero dejando la versión funcional del script por ahora.
Jacob Vlijm
@SumeetDeshmukh: No, pero hará que el script funcione con URL que contengan otros caracteres "especiales" además del carácter de espacio (U + 0020). Además, sería más robusto contra entradas erróneas o falsas y lo detectaría desde el principio.
David Foerster
@JacobVlijm: ¿Qué sucede cuando intentas usarlo en el script? ¿Mensaje de error? Resultados inesperados? ¿ unquoteFunciona como se esperaba?
David Foerster