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

19

Se houver imagens na pasta A, B, C ..... Z, como defino automaticamente a primeira imagem em cada uma dessas pastas como seu ícone de pasta? Existe uma maneira como um script ou outra coisa?

    
por JulianLai 08.07.2016 / 09:34

1 resposta

27

1. Alterar automaticamente o ícone da pasta para a primeira imagem encontrada dentro de

O script python abaixo mudará o ícone de todas as pastas dentro de um diretório (recursivamente) para o primeiro arquivo de imagem válido encontrado dentro da pasta.

O script

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

Download do Pastebin

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 ícone válidas.
  3. Execute-o com o diretório de destino como um argumento:

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

É isso aí!

2. Mais avançado

... é para torná-lo uma opção de clique com o botão direito do mouse no nautilus:

O script é um pouco diferente, então:

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

Download do Pastebin

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. Faça logout e volte, funciona.

Notas

  • Isso alterará o ícone de todas as pastas dentro da pasta clicada com o botão direito, não da pasta em si.
  • Como os.path.realpath() é usado, isso também funciona se a pasta de destino for um link.

EDITAR

Desfazer (reconfigurar) os ícones personalizados dentro de um diretório recursivamente

Se, por algum motivo, você quiser redefinir os ícones dentro de uma pasta para o (s) ícone (s) padrão (s), use o script abaixo. Simplesmente:

  • copie-o para um arquivo vazio, salve-o como reset_icons.py
  • execute-o pelo comando:

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

O script

#!/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"
            ])
    
por Jacob Vlijm 08.07.2016 / 10:42