Come posso modificare o impostare l'icona per un file o una cartella, nel terminale, devo usare un linguaggio di scripting?
Avrai bisogno degli Strumenti per sviluppatori installati, quindi potrebbe funzionare quanto segue. Questo prende l'immagine in icon.png
e la applica 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 quasi ha iniziato una taglia su questo, perché non sono riuscito a cambiare l'icona di una cartella usando @ mankoff 's risposta . Ma ho trovato una soluzione.
Per cambiare l'icona della cartella non puntare Rez -append tmp.rsrc
nella cartella ma un file Icon\r
speciale all'interno della cartella. Se non hai precedentemente impostato un'icona personalizzata nella cartella, il file probabilmente non esiste, ma Rez
lo crea al volo. L'eliminazione del file Icon\r
rimuoverà l'icona personalizzata, quindi per evitare incidenti è bene essere nascosti.
Queste sono le modifiche alla risposta di 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'
Con il beneficio di diversi anni di senno di poi:
risposta di user588 e la risposta di koiyu funziona bene, ma si basano su programmi di utilità ( Rez
, DeRez
e SetFile
) che:
Rez
e DeRez
, perché si riferiscono a Carbon) osxiconutils sembra interessante, ma non verrà più compilato (a partire da OSX 10.10.4) .
Pertanto ho creato CLI fileicon
, che dovrebbe funzionare su macchina OSX pristine (nessun prerequisito) ; è uno script Bash basato principalmente su xattr
, xxd
e uno script Python incorporato che chiama Cocoa, per gentile concessione di questo utile rispondere .
Consente di impostare / rimuovere / estrarre icone personalizzate per / da file o cartelle , compresi i volumi APFS su macOS 10.13 (High Sierra).
Puoi installarlo come segue:
[sudo] npm install -g fileicon
fileicon
(questo link rimarrà aggiornato). chmod +x fileicon
. $PATH
, ad esempio /usr/local/bin
(richiede sudo
). Ecco le informazioni di utilizzo; per informazioni complete, consulta il manuale :
$ 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
Oltre a Ruby, ecco una versione di 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 che è preinstallato in Mac OS ha già PyObjC quindi non devi installare alcun pacchetto.
Controlla setfileicon
(codice sorgente) , un'utilità creata da Damien Bobillot.
Scarica il file binario qui: link
Dopo aver decompresso il file, rendilo eseguibile:
chmod +x setfileicon
Quindi puoi usarlo come segue:
./setfileicon "my-icon.icns" "my-file-or-directory"
Ho un progetto github dove creo "goccioline" di AppleScript da [shell / bash, python, perl, ruby , ecc.] script che accettano percorsi di file come argomenti. Ho scritto questa funzione bash per cambiare l'icona di una cartella (perché i bundle di AppleScript sono cartelle con estensione .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 volta definito, si chiama la funzione con 2 argomenti:
replace_icon /path/to/AppleScript.app /path/to/icon.png
o
replace_icon /path/to/AppleScript.app http://i.imgur.com/LmUvWqB.png
Come puoi vedere il secondo argomento può essere un'immagine sul tuo sistema o un URL.
NOTA: il pazzo aspetto di $'/Icon\r'
che faccio è che il nome del file Icon termina con un letterale ritorno a capo \r
. Vedi di persona con:
find my-applescript.app -maxdepth 1 | less -U
Un'altra opzione è usare MacRuby:
/usr/local/bin/macruby -e 'framework "Cocoa";NSWorkspace.sharedWorkspace.setIcon(NSImage.alloc.initWithContentsOfFile("/tmp/a.png"),forFile:"/tmp/file",options:0)'
Puoi scaricare un programma di installazione per MacRuby dal link .
Supponendo che abbiamo già un file icns. Crea un file di risorse temporali che punti al file icns:
$ echo "read 'icns' (-16455) \"Icon.icns\";" >> Icon.rsrc
Aggiungi il file di risorse come valore dell'attributo esteso "com.apple.ResourceFork" a un file:
$ Rez -a Icon.rsrc -o FileName.ext
Mostra l'icona del file:
$ SetFile -a C FileName.ext
Aggiungi il file di risorse come valore dell'attributo esteso "com.apple.ResourceFork" a un file di icona magico all'interno della cartella corrente:
$ Rez -a Icon.rsrc -o Icon$'\r'
Mostra l'icona della cartella corrente:
$ SetFile -a C .
Nascondi il file dell'icona magica nella cartella corrente (premi ⇧⌘ per mostrare / nascondere i file nascosti nel Finder):
$ SetFile -a V Icon$'\r'
I dati dell'icona sono memorizzati come valore dell'attributo esteso "com.apple.ResourceFork" (il comando terminale "xattr -p com.apple.ResourceFork FileName.ext" stampa il valore). Per una cartella c'è un file magico (che è vuoto e nascosto) Icon$'\r'
all'interno della cartella. Per estrarre i dati delle icone dall'attributo esteso "com.apple.ResourceFork" in un file di risorse di testo semplice (da cui conosciamo l'identificatore di tipo icns corretto "-16455"):
$ DeRez -only icns FileWithIcon.ext > Icon.rsrc
$ DeRez -only icns /Folder/With/Icon/Icon$'\r' > Icon.rsrc
Sotto macOS 10.13 Comando High Sierra $ sips -i ImageFile.icns/png/jpg
genera l'errore "--addIcon non è più supportato". Cambia "-i" significa "--addIcon" come attributo esteso "com.apple.ResourceFork" su questo file stesso usando il contenuto di questo file immagine.
Stranamente la soluzione migliore sembra essere quella di non usare gli strumenti di Apple ma il codice Python perché ha vari vantaggi non essendo limitato da:
Aggiorna
Ora (su macOS Sierra) la risposta di @koiyu sembra funzionare, quindi è possibile utilizzare questo two-liner per copiare l'icona da una cartella di origine alla cartella di destinazione:
#!/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
Leggi altre domande sui tag command-line script icon