¿Cómo puedo cambiar o configurar el icono de un archivo o carpeta, en el terminal, ¿necesito usar un lenguaje de script?
¿Cómo puedo cambiar o configurar el icono de un archivo o carpeta, en el terminal, ¿necesito usar un lenguaje de script?
Respuestas:
Necesitará las herramientas de desarrollador instaladas, y luego lo siguiente podría funcionar. Esto toma el gráfico icon.png
y 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.
Rez -append
cuando trabajo con .avi
archivos. ### Rez - Fatal error trying to open the resource file "Video.avi" for writing.
`alguna idea?
$PATH
(stubs en /usr/bin
que 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 Rez
y DeRez
.
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
, DeRez
y SetFile
) que:
Rez
y 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
, xxd
y 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:
[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
fileicon --man
).
curl -L http://git.io/n-install | bash
.
fileicon
, que todavía funciona (y, de hecho, fue creada, porque osxiconutils
ya no funciona). He actualizado la respuesta para aclarar eso. .
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.rsrc
a la carpeta sino a un Icon\r
archivo especial dentro de la carpeta. Si no ha establecido un ícono personalizado en la carpeta antes, el archivo probablemente no existirá, pero lo Rez
crea sobre la marcha. Al eliminar el Icon\r
archivo 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'
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.
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"
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
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'
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/jpg
genera 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.
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 .
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:
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
En la versión reciente de macOS (10.14), sips -i icon.png
obtendrá un --addIcon is no longer supported
error.
También necesita herramientas de desarrollador instaladas. Esto usa el gráfico Icon.png
y 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
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í:
#!/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.