¿Cómo puedo cambiar un icono de archivo o carpeta usando la Terminal?


54

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



Tenga en cuenta que no escala bien. Intenté aplicar íconos a muchos directorios en un directorio: Finder funcionó muy lentamente.
kolen

Respuestas:


32

Necesitará las herramientas de desarrollador instaladas, y luego lo siguiente podría funcionar. Esto toma el gráfico icon.pngy lo 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.

Impresionante, eso es justo lo que quería.
Ocodo

Tengo problemas Rez -appendcuando trabajo con .aviarchivos. ### Rez - Fatal error trying to open the resource file "Video.avi" for writing.`alguna idea?
ocodo

Curiosamente, también hizo que el archivo no pueda aceptar un nuevo ícono a través del método de copiar / pegar Obtener información.
ocodo

¿Hay alguna restricción en el tamaño del icono? Si uso un jpg grande (1024x768), se redimensionará a algo realmente pequeño. ¿Puedo conservar de alguna manera su tamaño original?
nuc

3
Tenga en cuenta que en las versiones recientes de OSX las herramientas de desarrollo están en $PATH(stubs en /usr/binque saben dónde encontrar las herramientas reales), y ya no están /Developer/Tools, por lo que debe invocarlas solo por sus nombres de archivo; es decir, en el caso en cuestión, como just Rezy DeRez.
mklement0

19

Con el beneficio de varios años de retrospectiva:

La respuesta de user588 y la respuesta de koiyu trabajo bien, pero que dependen de los servicios públicos ( Rez, DeRezy SetFile) que:

  • no se instalan por defecto (vienen con Xcode o las utilidades de línea de comandos del desarrollador)
  • ahora están en desuso ( Rezy DeRez, porque se relacionan con el carbono)

osxiconutils parece interesante, pero ya no se compilará (a partir de OSX 10.10.4) .


Por lo tanto, he creado CLIfileicon , que debería funcionar en una máquina OSX prístina (sin requisitos previos) ; es una secuencia de comandos Bash basada principalmente en xattr, xxdy una secuencia de comandos de Python incrustado que llama cacao, la cortesía de esta respuesta es útil .

Permite configurar / eliminar / extraer iconos personalizados para / de archivos o carpetas , incluso en volúmenes APFS en macOS 10.13 (High Sierra).

Puede instalarlo de la siguiente manera:

  • Si tiene Node.js instalado, desde el registro npm , con
    [sudo] npm install -g fileicon
  • De otra manera:
    • Descargue la CLI como fileicon(este enlace se mantendrá actualizado).
    • Hazlo ejecutable con chmod +x fileicon.
    • Moverlo o vincularlo 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

@Slomojo: [En respuesta a un comentario eliminado] Entiendo que no todo el mundo tiene o quiere instalar Node.js, es por eso que el enlace de descarga directa también está allí (vea el elemento de la lista 'De lo contrario:' en mi respuesta) - es una secuencia de comandos Bash autónoma (lo único que renuncia al instalar de esta manera es la instalación de la página del manual, pero puede obtener una representación en texto plano de la página del manual fileicon --man).
mklement0

@Slomojo: [En respuesta a un comentario eliminado] En cuanto a por qué se ofrece la instalación a través de npm: he encontrado que el ecosistema npm es mi administrador de paquetes favorito en general, y he publicado una serie de scripts multiplataforma CLI basadas en allí que no están relacionadas con Node.js. También he crear un solo comando, instalador de nivel de usuario para NGP (a través de n y Node.js) que hace que sea fácil de usar NPM incluso para las personas que de otra manera no tienen ningún interés en Node.js: curl -L http://git.io/n-install | bash.
mklement0

3
Esta es una buena solución de trabajo lista para usar. +1
usuario3439894

1
@PatNiemeyer: Gracias, he actualizado el enlace osxiconutils, pero tenga en cuenta que esta respuesta es sobre la utilidadfileicon , que todavía funciona (y, de hecho, fue creada, porque osxiconutilsya no funciona). He actualizado la respuesta para aclarar eso. .
mklement0

1
Me doy cuenta de que estoy unos años detrás de todos los demás en este hilo, pero solo quería mencionar que descubrí esto hoy y es genial. ¡Gracias por hacerlo! 👍
TJ Luoma

18

Yo casi empecé una recompensa por esto, porque no he podido cambiar el icono de una carpeta usando @ Mankoff 's respuesta . Pero encontré una solución.


Para cambiar el icono de la carpeta, no apunta Rez -append tmp.rsrca la carpeta sino a un Icon\rarchivo especial dentro de la carpeta. Si no ha establecido un ícono personalizado en la carpeta antes, el archivo probablemente no existirá, pero lo Rezcrea sobre la marcha. Al eliminar el Icon\rarchivo se eliminará el ícono personalizado, por lo que para evitar accidentes es bueno estar oculto.

Estas son las modificaciones a la respuesta de 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'

¿Y para un archivo? Tenga en cuenta mi comentario re: archivos avi
ocodo

@slomojo lo siento, pero no puedo replicar el error que obtienes, solo probé la solución de mankoff con un archivo .avi. Vuelva a verificar los permisos de archivo y los comandos que ingresó?
Jari Keinänen

Voy a darle otra oportunidad, tal vez cometí un error antes.
ocodo

Estoy tratando desesperadamente de hacer esto para una memoria USB. Todos los comandos "funcionan" en el sentido de que no devuelven errores, pero todavía me queda una unidad de disco USB con un icono sin cambios. Cualquier idea y estaría eternamente agradecido!
singmotor

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 preinstalado en Mac OS ya tiene PyObjC, por lo que no tiene que instalar ningún paquete.


Agregué la decodificación de UTF-8 a Unicode, de lo contrario, el script no funcionó con nombres de archivo que no son ASCII. También se agregó la comprobación del valor de retorno, si no se configura el ícono se generará un código de retorno de 1.
kolen

1
¿Hay alguna forma de especificar que el icono no tenga una relación de aspecto modificada? Funciona muy bien, pero los archivos de imagen se reforman en un cuadrado. ¡Gracias!
Gustavo Bezerra

1
No encontré exactamente la respuesta, pero cuadrar las imágenes con relleno transparente antes de que la mano funcionara bien: stackoverflow.com/questions/12179342/…
Gustavo Bezerra

7

Echa un vistazo setfileicon(código fuente) , una utilidad creada por Damien Bobillot.

Descargue el binario aquí: http://maxao.free.fr/telechargements/setfileicon.gz

Después de descomprimir el archivo, hágalo ejecutable:

chmod +x setfileicon

Entonces puede usarlo de la siguiente manera:

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

Gracias por eso, muy útil de hecho. Por cierto, estoy editando el método GUI, para reducir el ruido.
ocodo

Desafortunadamente, la mayoría del código ahora está en desuso.
Mugen

3

Tengo un proyecto github donde creo "gotitas" de AppleScript a partir de scripts [shell / bash, python, perl, ruby, etc.] que toman las rutas de los archivos como argumentos. Escribí esta función bash para cambiar el ícono de una carpeta (porque los paquetes 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 definido, 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: Esa $'/Icon\r'cosa de aspecto loco que hago es porque el nombre del archivo Icon termina con un retorno de carro literal\r . Véalo usted mismo con:

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

3

Asumiendo que ya tenemos el archivo icns. Cree un archivo de recursos temporales que apunte a icns-file:

$ 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 de icono mágico dentro de la carpeta actual (presione ⇧⌘. Para mostrar / ocultar archivos ocultos en 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 datos del icono del atributo extendido "com.apple.ResourceFork" en un archivo de recursos de texto sin formato (del que conocemos 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/jpggenera el error "--addIcon ya no es compatible". El interruptor "-i" significa "--addIcon" como atributo extendido "com.apple.ResourceFork" en este archivo usando el contenido de este archivo de imagen.


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

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 http://macruby.org .


1
El enlace, y MacRuby, aparentemente ahora están muertos; MacRuby aparentemente fue sucedido por el RubyMotion comercial, basado en suscripción .
mklement0

2

Por extraño que parezca, la mejor solución parece ser no usar las propias herramientas de Apple sino el código Python porque tiene varias ventajas que no están limitadas por:

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

Actualizar

Ahora (en macOS Sierra) la respuesta de @ koiyu parece funcionar, por lo que podría usar este 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

¡Bienvenido a Ask Different! Parece que sería mejor como comentario. Sé que todavía no tienes los puntos requeridos, pero le pregunté a alguien que tiene el poder para venir a echar un vistazo. Además, he escrito un Applescript que hace todo esto por usted en un paquete ordenado, vea mi respuesta a una pregunta similar en este SE.
JMY1000

Sí, lo intenté pero no pude hacerlo. Además, creo que la segunda parte de su comentario sería mejor como respuesta, no estar relacionada con la primera.
dardo82

2

En la versión reciente de macOS (10.14), sips -i icon.pngobtendrá un --addIcon is no longer supportederror.

También necesita herramientas de desarrollador instaladas. Esto usa el gráfico Icon.pngy lo aplica file.ext, al igual que la respuesta del usuario588 :

# 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

Al igual que la solución Python que usa PyObjC, resulta que solo se puede hacer con AppleScript (que no está en desuso en 10.15 Catalina, a diferencia de Python y otros lenguajes de secuencias de comandos).

Encontré un ejemplo de cómo hacer esto en GitHub aquí:

icono-buscador-set

#!/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

AppleScript no es fácil de leer, pero aparentemente es posible acceder al código Objective-C para hacerlo a través del marco de AppKit.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.