¿Cómo puedo cambiar el ícono de un archivo o carpeta usando la Terminal?

49

¿Cómo puedo cambiar o configurar el ícono de un archivo o carpeta, en el terminal, necesito usar un lenguaje de scripting?

    
pregunta ocodo 25.01.2011 - 00:21

9 respuestas

30

Necesitará las herramientas de desarrollo instaladas, y luego podría funcionar lo siguiente. 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.
    
respondido por el user588 25.01.2011 - 00:49
18

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'
    
respondido por el Jari Keinänen 11.03.2011 - 13:56
16

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:

  • no se instalan de forma predeterminada (vienen con Xcode o con las utilidades de línea de comandos del desarrollador)
  • ahora están en desuso ( 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:

  • Si tiene instalado Node.js, del registro npm , con
    [sudo] npm install -g fileicon
  • De lo contrario:
    • Descargue la CLI como fileicon (este enlace se mantendrá actualizado).
    • Hazlo ejecutable con chmod +x fileicon .
    • Moverlo o enlazarlo a una carpeta en su $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
    
respondido por el mklement0 04.08.2015 - 04:29
8

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.

    
respondido por el kolen 15.12.2014 - 22:19
7

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"
    
respondido por el Mathias Bynens 23.03.2012 - 21:51
3

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
    
respondido por el Bruno Bronosky 25.03.2013 - 19:26
2

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 .

    
respondido por el user495470 25.02.2014 - 20:33
2

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'

Detalles adicionales

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.

    
respondido por el Sergii Kryzhanovskyi 21.06.2018 - 21:34
1

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:

  • resolución de archivo de salida
    (funciona hasta 1024x1024)
  • formato de archivo de entrada
    (probado con ICNS y PNG)
  • permisos para instalar
    (Defínelo como una función)

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
    
respondido por el dardo82 20.05.2016 - 03:31

Lea otras preguntas en las etiquetas