¿Cómo puedo cambiar o configurar el ícono de un archivo o carpeta, en el terminal, necesito usar un lenguaje de scripting?
¿Cómo puedo cambiar o configurar el ícono de un archivo o carpeta, en el terminal, necesito usar un lenguaje de scripting?
Necesitará las Herramientas de desarrollo instaladas, y luego lo siguiente podría funcionar. Esto toma el gráfico en icon.png
y lo aplica a 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.
I casi inicié una recompensa por esto, porque no pude cambiar el ícono de una carpeta usando @ mankoff 's answer . Pero encontré una solución.
Para cambiar el ícono de la carpeta, no apunta Rez -append tmp.rsrc
a la carpeta, sino un archivo especial Icon\r
dentro de la carpeta. Si no ha establecido un icono personalizado en la carpeta anteriormente, es probable que el archivo no exista, pero Rez
lo crea sobre la marcha. Eliminar el archivo Icon\r
eliminará el ícono personalizado, por lo que para evitar accidentes es bueno ocultarlo.
Estas son las modificaciones a la respuesta del hombre:
# 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'
Con el beneficio de varios años de retrospectiva:
respuesta del usuario588 y la respuesta de koiyu funciona bien, pero se basan en las utilidades ( Rez
, DeRez
y SetFile
) que:
Rez
y DeRez
, porque se relacionan con el carbono) osxiconutils parece interesante, pero ya no compilará (a partir de OSX 10.10.4) .
Por lo tanto, he creado CLI fileicon
, que debería funcionar en un máquina OSX prístina (sin requisitos previos) ; es un script de Bash basado principalmente en xattr
, xxd
y un script Python incorporado que llama a Cocoa, cortesía de esto útil contestar .
Permite configurar / eliminar / extraer iconos personalizados para / desde archivos o carpetas , incluso en volúmenes APFS en macOS 10.13 (High Sierra).
Puedes instalarlo de la siguiente manera:
[sudo] npm install -g fileicon
fileicon
(este enlace se mantendrá actualizado). chmod +x fileicon
. $PATH
, como /usr/local/bin
(requiere sudo
). Aquí está la información de uso; para obtener información completa, consulte el 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
Además de Ruby, aquí hay una versión de 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
Python que preinstalado en Mac OS ya tiene PyObjC, por lo que no tienes que instalar ningún paquete.
Vea setfileicon
(código fuente) , una utilidad creada por Damien Bobillot.
Descargue el binario aquí: enlace
Después de descomprimir el archivo, hazlo ejecutable:
chmod +x setfileicon
Luego puedes usarlo de la siguiente manera:
./setfileicon "my-icon.icns" "my-file-or-directory"
Tengo un proyecto github donde creo "gotitas" de AppleScript desde [shell / bash, python, perl, ruby , etc.] scripts que toman rutas de archivos como argumentos. Escribí esta función de bash para cambiar el icono de una carpeta (porque los paquetes de AppleScript son carpetas con una extensión .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'
}
Una vez definida, llama a la función con 2 argumentos:
replace_icon /path/to/AppleScript.app /path/to/icon.png
o
replace_icon /path/to/AppleScript.app http://i.imgur.com/LmUvWqB.png
Como puede ver, el segundo argumento puede ser una imagen en su sistema o una URL.
NOTA: Lo que hago de manera loca $'/Icon\r'
que hago es porque el nombre del archivo del Icono termina con un literal retorno de carro \r
. Compruébelo usted mismo con:
find my-applescript.app -maxdepth 1 | less -U
Otra opción es usar MacRuby:
/usr/local/bin/macruby -e 'framework "Cocoa";NSWorkspace.sharedWorkspace.setIcon(NSImage.alloc.initWithContentsOfFile("/tmp/a.png"),forFile:"/tmp/file",options:0)'
Puede descargar un instalador para MacRuby desde enlace .
Suponiendo que ya tenemos el archivo icns. Cree un archivo de recursos temporales que apunte al archivo icns:
$ echo "read 'icns' (-16455) \"Icon.icns\";" >> Icon.rsrc
Agregue el archivo de recursos como valor del atributo extendido "com.apple.ResourceFork" a un archivo:
$ Rez -a Icon.rsrc -o FileName.ext
Mostrar el icono del archivo:
$ SetFile -a C FileName.ext
Agregue el archivo de recursos como valor del atributo extendido "com.apple.ResourceFork" a un archivo de icono mágico dentro de la carpeta actual:
$ Rez -a Icon.rsrc -o Icon$'\r'
Mostrar el icono de la carpeta actual:
$ SetFile -a C .
Oculte el archivo del icono mágico dentro de la carpeta actual (presione ⇧⌘. para mostrar / ocultar los archivos ocultos en el Finder):
$ SetFile -a V Icon$'\r'
Los datos del icono se almacenan como valor del atributo extendido "com.apple.ResourceFork" (el comando de Terminal "xattr -p com.apple.ResourceFork FileName.ext" imprime el valor). Para una carpeta hay un archivo mágico (que está vacío y oculto) Icon$'\r'
dentro de la carpeta. Para extraer los datos de ícono del atributo extendido "com.apple.ResourceFork" en un archivo de recursos de texto sin formato (de donde sabemos el identificador de tipo icns correcto "-16455"):
$ DeRez -only icns FileWithIcon.ext > Icon.rsrc
$ DeRez -only icns /Folder/With/Icon/Icon$'\r' > Icon.rsrc
En macOS 10.13, el comando High Sierra $ sips -i ImageFile.icns/png/jpg
genera el error "--addIcon ya no es compatible". El interruptor "-i" significa "--addIcon" como atributo extendido "com.apple.ResourceFork" en este archivo utilizando el contenido de este archivo de imagen.
Por extraño que parezca, la mejor solución parece ser no utilizar las herramientas propias de Apple sino el código Python porque tiene varias ventajas que no están limitadas por:
Actualizar
Ahora (en macOS Sierra), la respuesta de @ koiyu parece funcionar, por lo que puede usar este complemento de dos líneas para copiar el icono de una carpeta de origen a su carpeta 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
Lea otras preguntas en las etiquetas command-line script icon