¿Cómo puedo cambiar o configurar el ícono de un archivo o carpeta, en la terminal, necesito usar un lenguaje de secuencias de comandos?
Necesitarás las herramientas de desarrollo instaladas y, luego, lo siguiente podría funcionar. Esto toma el gráfico 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.
Rez -append
cuando trabajo con .avi
archivos. ### Rez - Fatal error trying to open the resource file "Video.avi" for writing.
¿alguna idea?sips -Z 512 image.png --out smaller-image.png
(aunque si desea tener control sobre los algoritmos de remuestreo, tal vez un software de procesamiento de imágenes sea una mejor idea).$PATH
(stubs en los /usr/bin
que se sabe dónde encontrar las herramientas reales), y /Developer/Tools
ya no, por lo que debe invocarlas solo por sus nombres de archivo; es decir, en el caso que nos ocupa, como justo Rez
y DeRez
.Con el beneficio de varios años de retrospectiva:
La respuesta de user588 y la respuesta de koiyu funcionan bien, pero dependen de utilidades ( Rez
, DeRez
y SetFile
) que:
Rez
y DeRez
, porque se relacionan con Carbon)osxiconutils parece interesante, pero ya no compilará (a partir de macOS 10.10.4) .
Por lo tanto, he creado CLIfileicon
, que debería funcionar en una máquina OSX prístina (sin requisitos previos) ; es un script de Bash basado principalmente en xattr
y xxd
un script de Python incrustado que llama a Cocoa, cortesía de esta útil respuesta .
Permite configurar/eliminar/extraer íconos personalizados para/desde archivos o carpetas , incluso en volúmenes APFS en macOS 10.13 (High Sierra).
Puedes instalarlo de la siguiente manera:
Si tienes Homebrew instalado:brew install fileicon
Si tiene instalado Node.js, desde el registro npm , con
[sudo] npm install -g fileicon
De lo contrario:
fileicon
(este enlace permanecerá 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 aún funciona (y, de hecho, se creó, porque osxiconutils
ya no funciona). Actualicé la respuesta para que quede más claro. .Casi comencé una recompensa por esto, porque no logré cambiar el ícono de una carpeta usando la respuesta de @ mankoff . Pero encontré una solución.
Para cambiar el ícono 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 configurado un icono personalizado en la carpeta antes, es probable que el archivo no exista, pero Rez
lo crea sobre la marcha. Al eliminar el Icon\r
archivo, se eliminará el icono personalizado, por lo que, para evitar accidentes, es bueno ocultarlo.
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 que está preinstalado en Mac OS ya tiene PyObjC, por lo que no tiene que instalar ningún paquete.
Consulte 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 puedes usarlo de la siguiente manera:
./setfileicon "my-icon.icns" "my-file-or-directory"
Tengo un proyecto de github en el que creo "gotas" de AppleScript a partir de scripts [shell/bash, python, perl, ruby, etc.] que toman rutas de archivo como argumentos. Escribí esta función bash para cambiar el ícono 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, llamas 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 locura $'/Icon\r'
que hago es porque el nombre del archivo Icon termina con un retorno de carro literal\r
. Compruébelo usted mismo con:
find my-applescript.app -maxdepth 1 | less -U
Suponiendo que ya tenemos el archivo icns. Cree un archivo de recursos temporal 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 ícono 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 de iconos 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". Cambie "-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 de 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 ícono 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
Al igual que la solución de Python que usa PyObjC, resulta que se puede hacer solo con AppleScript (que no está obsoleto 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 de Objective-C para hacer esto a través del marco AppKit.
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 desarrollo instaladas. Esto usa el gráfico Icon.png
y lo aplica file.ext
, al igual que la respuesta de 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
Error: Unable to write image to file /Users/uname/tmpicns.icns.4rzX6
en el primer comando. Incluso intento con sudo
, no funcionasips -z x x input.png -o output.png
donde x es la altura y el ancho de la imagen, respectivamente. Esto creará una copia de input.png con la altura y el ancho especificados. Luego, solo asegúrese de que el archivo de salida esté dentro de la carpeta iconset.Hay algún tipo de error (que ocurre en las carpetas dentro de la sincronización de iCloud) con el cambio de íconos de "carpetas" ni de archivos, por fin en Catalina: cuando el ícono cambia, la interfaz de usuario no actualiza la carpeta con el nuevo ícono cuando tenga uno mayor. Entonces, la segunda vez que configura un ícono, no se actualiza todas las veces. Aunque lo hagas manualmente con cmd+i y pegando como icono una imagen previamente copiada, iCloud se vuelve loco con esto.
Al buscar una solución alternativa, encontré esta pequeña solución (no es ideal pero funciona): - esto está en JXA Javascript para automatización
function makeIcon(theFolder, theFile) {
var img = $.NSImage.alloc.initByReferencingFile( theFile );
var updateUUID = newUUID()+".txt";
terminal("echo -n > "+ sanityzeForBash(theFolder+"/Icon\r") );
terminal("rm "+ sanityzeForBash(theFolder+"/Icon\r") );
writeTextFile(theFolder+"/"+updateUUID, "_");
$.NSWorkspace.sharedWorkspace.setIconForFileOptions(img, theFolder, 0);
delay(1);
terminal("rm "+ sanityzeForBash(theFolder+"/"+updateUUID) );
}
function writeTextFile(fileName, text) {
var file = app.openForAccess(Path(fileName), { writePermission: true })
app.setEof(file, { to: 0 });
app.write( getProperties(text) +"\n\r", { to: file, startingAt: app.getEof(file) })
app.closeAccess(file)
return true;
}
function sanityzeForBash(s) {
return "'"+ s.replace("'","\\'") +"'";
}
function newUUID(){
return ObjC.unwrap($.NSUUID.UUID.UUIDString);
}
function terminal(c) {
var app = Application.currentApplication();
app.includeStandardAdditions = true;
return app.doShellScript(c);
}
La idea del "truco" es crear un archivo dentro de la carpeta antes de cambiar el ícono para forzar la sincronización de iCloud, luego esperar 1 segundo para eliminar el archivo.
touch
la carpeta para que Finder vuelva a renderizar.
usuario588
colón