Come posso modificare o impostare l'icona per un file o una cartella, nel terminale, devo usare un linguaggio di scripting?
Come posso modificare o impostare l'icona per un file o una cartella, nel terminale, devo usare un linguaggio di scripting?
Risposte:
Avrai bisogno degli strumenti per sviluppatori installati e quindi potrebbero funzionare le seguenti opzioni. Questo prende l'immagine 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.
Rez -append
quando lavoro con i .avi
file. ### Rez - Fatal error trying to open the resource file "Video.avi" for writing.
`qualche idea?
$PATH
(stub /usr/bin
che sanno dove trovare gli strumenti reali), e non /Developer/Tools
più in, quindi è necessario invocarli solo con i loro nomi di file; vale a dire, nel caso in esame, come giusto Rez
e DeRez
.
Con il vantaggio di diversi anni di senno di poi:
La risposta di user588 e la risposta di koiyu funzionano bene, ma si basano su programmi di utilità ( Rez
, DeRez
, e SetFile
) che:
Rez
e DeRez
, poiché si riferiscono al carbonio)gli osxiconutils sembrano interessanti, ma non verranno più compilati (a partire da OSX 10.10.4) .
Pertanto ho creato la CLIfileicon
, che dovrebbe funzionare su una macchina OSX incontaminata (senza prerequisiti) ; è uno script Bash basato principalmente su xattr
, xxd
e uno script Python incorporato che chiama Cocoa, per gentile concessione di questa utile risposta .
Permette di impostare / rimuovere / estrarre icone personalizzate per / da file o cartelle , anche su volumi APFS su macOS 10.13 (High Sierra).
Puoi installarlo come segue:
[sudo] npm install -g fileicon
fileicon
(questo collegamento rimarrà aggiornato).chmod +x fileicon
.$PATH
, come /usr/local/bin
(richiede sudo
).Ecco le informazioni sull'utilizzo; per informazioni complete, consultare 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
fileicon --man
).
curl -L http://git.io/n-install | bash
.
fileicon
, che funziona ancora (e, di fatto, è stata creata, perché osxiconutils
non funziona più) - Ho aggiornato la risposta per renderlo più chiaro .
Ho quasi iniziato una taglia su questo, perché non sono riuscito a cambiare l'icona di una cartella usando la risposta di @ mankoff . Ma ho trovato una soluzione.
Per cambiare l'icona della cartella non si punta Rez -append tmp.rsrc
alla cartella ma a un Icon\r
file speciale all'interno della cartella. Se prima non hai impostato un'icona personalizzata sulla cartella, probabilmente il file non esisterà, ma lo Rez
crea al volo. L'eliminazione del Icon\r
file rimuoverà l'icona personalizzata, quindi per evitare incidenti è bene essere nascosti.
Queste sono le modifiche alla risposta del 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'
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 preinstallato su Mac OS ha già PyObjC, quindi non è necessario installare alcun pacchetto.
Scopri setfileicon
(codice sorgente) , un'utilità creata da Damien Bobillot.
Scarica il file binario qui: http://maxao.free.fr/telechargements/setfileicon.gz
Dopo aver decompresso il file, renderlo eseguibile:
chmod +x setfileicon
Quindi puoi usarlo come segue:
./setfileicon "my-icon.icns" "my-file-or-directory"
Ho un progetto github in cui creo "goccioline" di AppleScript da script [shell / bash, python, perl, ruby, ecc.] Che prendono i percorsi dei file come argomenti. Ho scritto questa funzione bash per cambiare l'icona di una cartella (perché i bundle 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 definita, 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: Quella $'/Icon\r'
cosa pazza che faccio è perché il nome del file Icona termina con un ritorno a capo letterale\r
. Guarda tu stesso con:
find my-applescript.app -maxdepth 1 | less -U
Supponendo che abbiamo già file icns. Crea un file di risorse temporanee che punta 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 file di risorse come valore dell'attributo esteso "com.apple.ResourceFork" a un file icona magica nella cartella corrente:
$ Rez -a Icon.rsrc -o Icon$'\r'
Mostra l'icona della cartella corrente:
$ SetFile -a C .
Nascondi il file 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" (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 dell'icona dall'attributo esteso "com.apple.ResourceFork" in un file di risorse in testo semplice (dal quale conosciamo l'identificatore del tipo di icns corretto "-16455"):
$ DeRez -only icns FileWithIcon.ext > Icon.rsrc
$ DeRez -only icns /Folder/With/Icon/Icon$'\r' > Icon.rsrc
In macOS 10.13 il comando High Sierra $ sips -i ImageFile.icns/png/jpg
genera l'errore "--addIcon non è più supportato". Passare "-i" significa "--addIcon" come attributo esteso "com.apple.ResourceFork" su questo file stesso usando il contenuto di questo file immagine.
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 da http://macruby.org .
Stranamente la soluzione migliore sembra essere quella di non utilizzare gli strumenti di Apple ma il codice Python perché ha vari vantaggi non limitati da:
Aggiornare
Ora (su macOS Sierra) la risposta di @ koiyu sembra funzionare, quindi puoi usare questo doppio rivestimento per copiare l'icona da una cartella di origine nella 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
Nella recente versione di macOS (10.14), sips -i icon.png
verrà visualizzato un --addIcon is no longer supported
errore.
Ha anche bisogno di strumenti di sviluppo installati. Questo utilizza l'immagine Icon.png
e la applica file.ext
, proprio come la risposta di 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
Proprio come la soluzione Python che utilizza PyObjC, si scopre che può essere fatto solo con AppleScript (che non è deprecato in 10.15 Catalina, a differenza di Python e altri linguaggi di scripting).
Ho trovato un esempio di come eseguire questa operazione su GitHub qui:
#!/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 non è facile da leggere, ma a quanto pare è possibile accedere al codice Objective-C per farlo attraverso il framework AppKit.