Como posso alterar um ícone de arquivo ou pasta usando o Terminal


54

Como posso alterar ou definir o ícone de um arquivo ou pasta, no terminal, preciso usar uma linguagem de script?



Observe que ele não escala bem. Tentei aplicar ícones a vários diretórios em um diretório - o Finder funcionou muito lentamente.
— Kolen

Respostas:


32

Você precisará das Ferramentas do Desenvolvedor instaladas e, a seguir, poderá funcionar. Isso pega o gráfico icon.pnge o aplica file.ext.

# Take an image and make the image its own icon:
sips -i icon.png

# Extract the icon to its own resource file:
/Developer/Tools/DeRez -only icns icon.png > tmpicns.rsrc

# append this resource to the file you want to icon-ize.
/Developer/Tools/Rez -append tmpicns.rsrc -o file.ext

# Use the resource to set the icon.
/Developer/Tools/SetFile -a C file.ext

# clean up.
rm tmpicns.rsrc
# rm icon.png # probably want to keep this for re-use.

Incrível, era exatamente isso que eu queria.
— ocodo

Estou tendo problemas Rez -appendao trabalhar com .aviarquivos. ### Rez - Fatal error trying to open the resource file "Video.avi" for writing.`alguma idéia?
— ocodo

Curiosamente, também tornou o arquivo incapaz de aceitar um novo ícone através do método de copiar / colar Get Info.
— Ocodo

existe uma restrição no tamanho do ícone? Se eu usar um jpg grande (1024x768), ele será redimensionado para algo realmente pequeno. Posso, de alguma forma, manter seu tamanho original?
— nuc

3
Observe que nas versões recentes do OSX as ferramentas do desenvolvedor estão nos $PATH(stubs /usr/binque sabem onde encontrar as ferramentas reais) e não estão /Developer/Toolsmais, portanto, você deve invocá-las apenas pelos nomes de arquivos; ou seja, no caso em questão, como justo Reze DeRez.
— mklement0

19

Com o benefício de vários anos de retrospectiva:

A resposta de user588 e resposta de koiyu trabalho bem, mas eles contam com utilitários ( Rez, DeReze SetFile) que:

  • não são instalados por padrão (eles vêm com o Xcode ou com os utilitários de linha de comando do desenvolvedor)
  • agora estão obsoletos ( Reze DeRez, porque se relacionam ao carbono)

osxiconutils parece interessante, mas não será mais compilado (a partir do OSX 10.10.4) .


Portanto, eu criei a CLIfileicon , que deve funcionar em uma máquina OSX intocada (sem pré-requisitos) ; é um script Bash baseado principalmente em xattr, xxde um script Python incorporado que chama Cocoa, cortesia desta resposta útil .

Permite configurar / remover / extrair ícones personalizados para / de arquivos ou pastas , inclusive nos volumes APFS no macOS 10.13 (High Sierra).

Você pode instalá-lo da seguinte maneira:

  • Se você tiver o Node.js instalado, no registro npm , com
    [sudo] npm install -g fileicon
  • De outra forma:
    • Faça o download da CLI como fileicon(este link permanecerá atualizado).
    • Torne executável com chmod +x fileicon.
    • Mova-o ou faça o link simbólico para uma pasta na sua pasta $PATH, como /usr/local/bin(requer sudo).

Aqui estão as informações de uso; para informações completas, consulte o manual :

$ fileicon -h

Set a custom icon for a file or folder:

    fileicon set      <fileOrFolder> <imageFile>

 Remove a custom icon from a file or folder:

    fileicon rm       <fileOrFolder>

 Get a file or folder's custom icon:

    fileicon get [-f] <fileOrFolder> [<iconOutputFile>]

 Test if a file or folder has a custom icon:

    fileicon test     <fileOrFolder>

 -q ...  silence status output

 Standard options: --help, --man, --version, --home

@ Slomojo: [Em resposta a um comentário excluído], entendo que nem todo mundo tem ou deseja instalar o Node.js, é por isso que o link de download direto também está lá (consulte o item de lista 'Caso contrário: `na minha resposta) - é um script Bash independente (a única coisa que você renuncia ao instalar dessa maneira é a instalação da página de manual, mas você pode obter uma renderização em texto sem formatação da página de manual fileicon --man).
— precisa

@ Slomojo: [Em resposta a um comentário excluído] Por que a instalação via npm é oferecida: eu achei o ecossistema npm o meu gerenciador de pacotes favorito em geral, e publiquei vários scripts de plataforma cruzada baseadas em CLI que não estejam relacionadas ao Node.js. Também criei um instalador de comando único, no nível do usuário, para o npm (via n e Node.js) que facilita o uso do npm, mesmo para pessoas que, de outra forma, não têm interesse no Node.js curl -L http://git.io/n-install | bash. : .
— precisa saber é o seguinte

3
Esta é uma boa solução pronta para trabalhar. 1
— user3439894

1
@ PatNiemeyer: Obrigado, atualizei o link osxiconutils, mas observe que esta resposta é sobre utilidadefileicon , que ainda funciona (e, de fato, foi criada, porque osxiconutilsnão funciona mais) - Atualizei a resposta para deixar isso mais claro .
— precisa

1
Sei que estou alguns anos atrás de todos os demais neste segmento, mas só queria mencionar que descobri isso hoje e é ótimo. Obrigado por fazer isso! 👍
— TJ Luoma

18

Eu quase comecei uma recompensa por isso, porque não consegui alterar o ícone de uma pasta usando a resposta de @ mankoff . Mas eu encontrei uma solução.


Para alterar o ícone da pasta, você não aponta Rez -append tmp.rsrcpara a pasta, mas para um Icon\rarquivo especial dentro da pasta. Se você não definiu um ícone personalizado para a pasta antes, o arquivo provavelmente não existirá, mas o Rezcria instantaneamente. A exclusão do Icon\rarquivo removerá o ícone personalizado; portanto, para evitar acidentes, é bom ocultar.

Estas são as modificações na resposta do mankoff:

# Append a resource to the folder you want to icon-ize.
Rez -append tmpicns.rsrc -o $'myfolder/Icon\r'

# Use the resource to set the icon.
SetFile -a C myfolder/

# Hide the Icon\r file from Finder.
SetFile -a V $'myfolder/Icon\r'

E para um arquivo? Observe o meu comentário re: avi files
— ocodo 12/03/11

@ Slomojo desculpe, mas não consigo replicar o erro que você recebe - apenas testei a solução do mankoff com um arquivo .avi. Verifique novamente as permissões e os comandos do arquivo digitados?
— Jari Keinänen 15/03

Vou tentar de novo, talvez eu tenha cometido um erro antes.
— Ocodo 15/03

Estou desesperadamente tentando fazer isso em um pen drive USB. Todos os comandos "funcionam", pois não retornam erros, mas ainda resta um pen drive com um ícone inalterado. Qualquer pensamento e eu ficaria eternamente grato!
— Singmotor 7/08/2015

8

Além do Ruby, aqui está uma versão do Python:

#!/usr/bin/env python
import Cocoa
import sys

Cocoa.NSWorkspace.sharedWorkspace().setIcon_forFile_options_(Cocoa.NSImage.alloc().initWithContentsOfFile_(sys.argv[1].decode('utf-8')), sys.argv[2].decode('utf-8'), 0) or sys.exit("Unable to set file icon")

./set-image.py image.png myfile

O Python pré-instalado no Mac OS já possui o PyObjC, portanto você não precisa instalar nenhum pacote.


Eu adicionei a decodificação de UTF-8 ao unicode, caso contrário, o script não funcionaria com nomes de arquivos não ASCII. Além disso, verifique adicional de valor de retorno, a falta de conjunto de ícones irá resultar em código de retorno de 1.
— Kolen

1
Existe alguma maneira de especificar o ícone para que a proporção não seja modificada? Funciona muito bem, mas os arquivos de imagem são remodelados para um quadrado. Obrigado!
— Gustavo Bezerra

1
Não exatamente encontrar a resposta, mas quadratura as imagens com preenchimento transparente antes da mão funcionou muito bem: stackoverflow.com/questions/12179342/...
— Gustavo Bezerra

7

Confira setfileicon(código fonte) , um utilitário criado por Damien Bobillot.

Faça o download do binário aqui: http://maxao.free.fr/telechargements/setfileicon.gz

Após descompactar o arquivo, torne-o executável:

chmod +x setfileicon

Então você pode usá-lo da seguinte maneira:

./setfileicon "my-icon.icns" "my-file-or-directory"

Obrigado por isso, muito útil mesmo. BTW, estou editando o método GUI, para reduzir o ruído.
— Ocho

Infelizmente, a maioria dos códigos agora está obsoleta.
— Mugen

3

Eu tenho um projeto no github onde crio "gotículas" AppleScript a partir de scripts [shell / bash, python, perl, ruby ​​etc.] que usam caminhos de arquivo como argumentos. Eu escrevi esta função bash para alterar o ícone de uma pasta (porque os pacotes AppleScript são pastas com uma extensão .app).

replace_icon(){
    droplet="$1"
    icon="$2"
    if [[ "$icon" =~ ^https?:// ]]; then
        curl -sLo /tmp/icon "$icon"
        icon=/tmp/icon
    fi
    rm -rf "$droplet"$'/Icon\r'
    sips -i "$icon" >/dev/null
    DeRez -only icns "$icon" > /tmp/icns.rsrc
    Rez -append /tmp/icns.rsrc -o "$droplet"$'/Icon\r'
    SetFile -a C "$droplet"
    SetFile -a V "$droplet"$'/Icon\r'
}

Uma vez definido, você chama a função com 2 argumentos:

replace_icon /path/to/AppleScript.app /path/to/icon.png

ou

replace_icon /path/to/AppleScript.app http://i.imgur.com/LmUvWqB.png

Como você pode ver, o segundo argumento pode ser uma imagem no seu sistema ou um URL.

OBSERVAÇÃO: Essa $'/Icon\r'coisa de aparência louca que eu faço é porque o nome do arquivo Icon termina com um retorno de carro literal\r . Veja você mesmo com:

find my-applescript.app -maxdepth 1 | less -U

3

Supondo que já temos o arquivo icns. Crie um arquivo de recurso temporário que aponte para o arquivo icns:

$ echo "read 'icns' (-16455) \"Icon.icns\";" >> Icon.rsrc

Anexe o arquivo de recurso como valor do atributo estendido "com.apple.ResourceFork" a um arquivo:

$ Rez -a Icon.rsrc -o FileName.ext

Mostre o ícone do arquivo:

$ SetFile -a C FileName.ext

Anexe o arquivo de recurso como valor do atributo estendido "com.apple.ResourceFork" a um arquivo de ícone mágico dentro da pasta atual:

$ Rez -a Icon.rsrc -o Icon$'\r'

Mostre o ícone da pasta atual:

$ SetFile -a C .

Oculte o arquivo de ícone mágico dentro da pasta atual (pressione to. Para mostrar / ocultar arquivos ocultos no Finder):

$ SetFile -a V Icon$'\r'

Detalhes adicionais

Os dados do ícone são armazenados como valor do atributo estendido "com.apple.ResourceFork" (o comando do terminal "xattr -p com.apple.ResourceFork FileName.ext" imprime o valor). Para uma pasta, há um arquivo mágico (vazio e oculto) Icon$'\r'dentro da pasta. Para extrair dados do ícone do atributo estendido "com.apple.ResourceFork" em um arquivo de recurso de texto sem formatação (do qual sabemos o identificador correto do tipo de icns "-16455"):

$ DeRez -only icns FileWithIcon.ext > Icon.rsrc
$ DeRez -only icns /Folder/With/Icon/Icon$'\r' > Icon.rsrc

No macOS 10.13, o comando High Sierra $ sips -i ImageFile.icns/png/jpggera o erro "--addIcon não é mais suportado". Alterne "-i" significa "--addIcon" como atributo estendido "com.apple.ResourceFork" para esse arquivo, usando o conteúdo desse arquivo de imagem.


# <stdin>: 1: ### /Applications/Xcode.app/Contents/Developer/usr/bin/Rez - SysError 0 durante a leitura.
— quanta

2

Outra opção é usar o MacRuby:

/usr/local/bin/macruby -e 'framework "Cocoa";NSWorkspace.sharedWorkspace.setIcon(NSImage.alloc.initWithContentsOfFile("/tmp/a.png"),forFile:"/tmp/file",options:0)'

Você pode baixar um instalador para MacRuby em http://macruby.org .


1
O link - e MacRuby - aparentemente estão agora mortos; Aparentemente, o MacRuby foi sucedido pelo RubyMotion comercial, baseado em assinatura .
— mklement0

2

Curiosamente, a melhor solução parece não ser usar as próprias ferramentas da Apple, mas o código Python, pois possui várias vantagens, não sendo limitado por:

  • resolução de arquivo de saída
    (funciona até 1024x1024)
  • formato de arquivo de entrada
    (tentado com ICNS e PNG)
  • permissões para instalar
    (defini-lo como uma função)

Atualizar

Agora (no macOS Sierra), a resposta de @ koiyu parece funcionar, então você pode usar este verso para copiar o ícone de uma pasta de origem para a pasta de destino:

#!/bin/sh

DeRez -only icns $1/Icon$'\r' > icon.rsrc; Rez -a icon.rsrc -o $2/Icon$'\r'
SetFile -a C $2; SetFile -a V $2/Icon$'\r'; rm icon.rsrc

Bem-vindo ao perguntar diferente! Parece que seria melhor como um comentário. Sei que você ainda não tem os pontos necessários, mas pedi a alguém que tem o poder de vir dar uma olhada. Além disso, eu escrevi um Applescript que faz tudo isso para você em um pacote bem organizado; veja minha resposta a uma pergunta semelhante neste SE.
— JMY1000 # 20/16

Sim, tentei, mas não consegui. Além disso, acho que a 2ª parte do seu comentário seria melhor como resposta, não estando relacionada à 1ª.
— Dardo82 22/05

2

Na versão recente do macOS (10.14), sips -i icon.pngocorrerá um --addIcon is no longer supportederro.

Ele também precisa das Ferramentas do Desenvolvedor instaladas. Isso usa o gráfico Icon.pnge o aplica file.ext, assim como a resposta do user588 :

# Covert Icon.png to tmpicons.icns:
sips -s format icns Icon.png --out tmpicns.icns

# Create temporary resource file which points to tmpicons.icns:
echo "read 'icns' (-16455) \"tmpicns.icns\";" >> tmpicns.rsrc

# append this resource to the file you want to icon-ize.
Rez -a tmpicns.rsrc -o file.ext

# Use the resource to set the icon.
SetFile -a C file.ext

# Clean up
rm tmpicons.icns && rm tmpicns.rsrc

0

Muito parecido com a solução Python usando PyObjC, pode ser feito apenas com AppleScript (que não é preterido na Catalina 10.15, ao contrário de Python e outras linguagens de script).

Encontrei um exemplo de como fazer isso no GitHub aqui:

set-finder-icon

#!/usr/bin/env osascript

use framework "AppKit"

--------------------------------------------------------------------------------
# PROPERTY DECLARATIONS:
property this : a reference to current application
property NSWorkspace : a reference to NSWorkspace of this
property NSImage : a reference to NSImage of this

--------------------------------------------------------------------------------
# IMPLEMENTATION:
on run argv
  set icon to item 1 of argv
  set target to item 2 of argv

  setIcon to icon for target
end run
--------------------------------------------------------------------------------
# HANDLERS:
to setIcon to iconPath for filePath
  set sharedWorkspace to NSWorkspace's sharedWorkspace()
  set newImage to NSImage's alloc()
  set icon to newImage's initWithContentsOfFile:iconPath

  set success to sharedWorkspace's setIcon:icon forFile:filePath options:0
end setIcon

O AppleScript não é fácil de ler, mas aparentemente é possível acessar o código Objective-C para fazer isso através da estrutura do AppKit.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.