Como posso alterar ou definir o ícone de um arquivo ou pasta, no terminal, preciso usar uma linguagem de script?
Como posso alterar ou definir o ícone de um arquivo ou pasta, no terminal, preciso usar uma linguagem de script?
Respostas:
Você precisará das Ferramentas do Desenvolvedor instaladas e, a seguir, poderá funcionar. Isso pega o gráfico icon.png
e 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.
Rez -append
ao trabalhar com .avi
arquivos. ### Rez - Fatal error trying to open the resource file "Video.avi" for writing.
`alguma idéia?
$PATH
(stubs /usr/bin
que sabem onde encontrar as ferramentas reais) e não estão /Developer/Tools
mais, portanto, você deve invocá-las apenas pelos nomes de arquivos; ou seja, no caso em questão, como justo Rez
e DeRez
.
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
, DeRez
e SetFile
) que:
Rez
e 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
, xxd
e 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:
[sudo] npm install -g fileicon
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
fileicon --man
).
curl -L http://git.io/n-install | bash
. : .
fileicon
, que ainda funciona (e, de fato, foi criada, porque osxiconutils
não funciona mais) - Atualizei a resposta para deixar isso mais claro .
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.rsrc
para a pasta, mas para um Icon\r
arquivo especial dentro da pasta. Se você não definiu um ícone personalizado para a pasta antes, o arquivo provavelmente não existirá, mas o Rez
cria instantaneamente. A exclusão do Icon\r
arquivo 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'
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.
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"
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
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'
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/jpg
gera 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.
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 .
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:
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
Na versão recente do macOS (10.14), sips -i icon.png
ocorrerá um --addIcon is no longer supported
erro.
Ele também precisa das Ferramentas do Desenvolvedor instaladas. Isso usa o gráfico Icon.png
e 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
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:
#!/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.