Como definir ícones de pasta de múltiplas pastas automaticamente?

10

Como definir a primeira foto de cada pasta como seu ícone de pasta?

A questão ligada acima tem uma resposta consistindo em um script que está trabalhando para mim. Só precisa de um pouco de melhoria.

O que isso faz?

Ele encontra arquivos com extensões .jpg, .jpeg, .png, .gif, .icns, .ico e os define como o ícone da pasta na qual o arquivo foi encontrado. Ele funciona em várias pastas, recursivamente. Basicamente, ele tenta encontrar um arquivo de imagem dentro da pasta e a primeira imagem encontrada é definida como um ícone de pasta. Ele funciona muito bem para muitos cenários, e a configuração desse script geralmente é a primeira coisa que faço depois da nova instalação (porque é incrível).

Qual é o problema?

Pode haver alguns diretórios que contêm muitos arquivos de imagem e o primeiro arquivo de imagem nesse diretório pode não ser adequado para ser o ícone da pasta.

O que deve fazer?

Em vez de ser baseado em extensão, se ele se tornar um nome de arquivo baseado em um nome (por exemplo, folder.png ) ou vários (por exemplo, albumart.png cover.png ), esse problema poderia ser resolvido.

ou melhor ainda, faça as duas abordagens funcionarem em um único script

  • Localizar filenames predefinido
  • Se encontrado, defina-o como ícone de pasta e vá para a próxima pasta
  • Se NÃO for encontrado, localize a extensão predefinida e defina-a como ícone de pasta e vá para a próxima pasta
por Sumeet Deshmukh 06.04.2017 / 14:45

1 resposta

8

Eu ainda posso "melhorar um pouco", mas abaixo estão as versões editadas das vinculadas.

Qual é a diferença?

Eu adicionei uma lista predefinida à seção head:

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

e eu substituí:

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 o script primeiro tente encontrar (arquivo) correspondências na lista specs , (somente) se não houver, ele pula para procurar a extensão correspondente e faz o truque se encontrar uma imagem adequada. / p>

1. A versão básica

Para ser usado com o diretório 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))
                ])

Como usar

  1. Copie o script em um arquivo vazio, salve-o como change_icon.py
  2. Na cabeça do script, edite, se desejar, a lista de extensões a serem usadas como imagens de ícones válidas. Também defina a lista preferida de nomes de arquivos.
  3. Execute-o com o diretório de destino como um argumento:

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

É isso aí!

2. A opção de clique com o botão direito do mouse editada, para ser usada como um script nautilus (clique com o botão direito do mouse)

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

Para usar

  1. Crie, se ainda não existir, o diretório

    ~/.local/share/nautilus/scripts
    
  2. Copie o script em um arquivo vazio, salve-o em ~/.local/share/nautilus/scripts como set_foldericons (sem extensão!) e torne-o executável .

  3. Na cabeça do script, edite, se desejar, a lista de extensões a serem usadas como imagens de ícones válidas. Também defina a lista preferida de nomes de arquivos.
  4. Faça logout e volte, e funciona.

Se, por algum motivo, você quiser redefinir os ícones dentro de uma pasta para os ícones padrão, use o script aqui

    
por Jacob Vlijm 23.05.2017 / 21:52