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?

ocodo
fonte
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.

fonte
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
mklement0
fonte
@ 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'
Jari Keinänen
fonte
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.

roubados
fonte
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"
Mathias Bynens
fonte
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
Bruno Bronosky
fonte
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.

Sergii Kryzhanovskyi
fonte
# <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 .

Lri
fonte
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
dardo82
fonte
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
FradSer
fonte
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.

Alexander O'Mara
fonte