Come posso cambiare l'icona di un file o di una cartella usando il Terminale


54

Come posso modificare o impostare l'icona per un file o una cartella, nel terminale, devo usare un linguaggio di scripting?



Si noti che non si adatta bene. Ho provato ad applicare le icone a molte directory in una directory - Finder ha funzionato molto lentamente.
Kolen,

Risposte:


32

Avrai bisogno degli strumenti per sviluppatori installati e quindi potrebbero funzionare le seguenti opzioni. Questo prende l'immagine icon.pnge 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.

Fantastico, è proprio quello che volevo.
ottobre

Ho problemi con Rez -appendquando lavoro con i .avifile. ### Rez - Fatal error trying to open the resource file "Video.avi" for writing.`qualche idea?
ottobre

È interessante notare che ha anche reso il file impossibile accettare una nuova icona tramite il metodo Copia / incolla Ottieni informazioni.
ottobre

c'è una limitazione sulla dimensione dell'icona? Se uso un jpg di grandi dimensioni (1024x768) verrebbe ridimensionato a qualcosa di veramente piccolo .. Posso in qualche modo conservare le sue dimensioni originali?
nuc

3
Si noti che nelle recenti versioni di OSX gli strumenti per sviluppatori si trovano nei $PATH(stub /usr/binche sanno dove trovare gli strumenti reali), e non /Developer/Toolspiù in, quindi è necessario invocarli solo con i loro nomi di file; vale a dire, nel caso in esame, come giusto Reze DeRez.
mklement0

19

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:

  • non sono installati per impostazione predefinita (vengono forniti con Xcode o le utility della riga di comando dello sviluppatore)
  • ora sono deprecati ( Reze 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, xxde 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:

  • Se hai installato Node.js, dal registro npm , con
    [sudo] npm install -g fileicon
  • Altrimenti:
    • Scarica l'interfaccia della riga di comando come fileicon(questo collegamento rimarrà aggiornato).
    • Renderlo eseguibile con chmod +x fileicon.
    • Spostalo o collegalo a una cartella nel tuo $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

@Slomojo: [In risposta a un commento da quando è stato eliminato] Capisco che non tutti hanno o vogliono installare Node.js, ecco perché c'è anche il link per il download diretto (vedi la voce dell'elenco "Altrimenti:" nella mia risposta) - è uno script Bash autonomo (l'unica cosa che si perde installando in questo modo è l'installazione della pagina man, ma è possibile ottenere un rendering in testo normale della pagina manuale con fileicon --man).
mklement0

@Slomojo: [In risposta a un commento cancellato] Per quanto riguarda il motivo per cui viene offerta l'installazione tramite npm: ho trovato l'ecosistema npm come il mio gestore di pacchetti preferito in generale e ho pubblicato numerosi script multipiattaforma lì basate su CLI che non sono correlate a Node.js. Ho anche creare un singolo comando, installatore a livello utente per NPM (via n e Node.js) che lo rende facile da usare NPM anche per persone che altrimenti non hanno alcun interesse in Node.js: curl -L http://git.io/n-install | bash.
mklement0

3
Questa è una bella soluzione pronta all'uso. +1
user3439894,

1
@PatNiemeyer: Grazie, ho aggiornato il link osxiconutils, ma nota che questa risposta riguarda l'utilitàfileicon , che funziona ancora (e, di fatto, è stata creata, perché osxiconutilsnon funziona più) - Ho aggiornato la risposta per renderlo più chiaro .
mklement0

1
Mi rendo conto di essere un po 'indietro rispetto agli altri su questo thread, ma volevo solo ricordare che l'ho scoperto oggi ed è fantastico. Grazie per averlo fatto! 👍
TJ Luoma,

18

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.rsrcalla cartella ma a un Icon\rfile speciale all'interno della cartella. Se prima non hai impostato un'icona personalizzata sulla cartella, probabilmente il file non esisterà, ma lo Rezcrea al volo. L'eliminazione del Icon\rfile 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'

E per un file? Nota il mio commento su: file avi
ocodo

@slomojo mi dispiace, ma non riesco a replicare l'errore che ricevi - ho appena testato la soluzione di mankoff con un file .avi. Ricontrolla le autorizzazioni e i comandi del file che hai inserito?
Jari Keinänen,

Ci proverò ancora, forse ho fatto un errore prima.
ocodo

Sto disperatamente cercando di farlo per una chiavetta USB. Tutti i comandi "funzionano" in quanto non restituiscono errori, ma mi rimane ancora una chiavetta con un'icona invariata. Qualsiasi pensiero e sarei eternamente grato!
singmotor

8

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.


Ho aggiunto la decodifica di UTF-8 a Unicode, altrimenti lo script non ha funzionato con nomi di file non ASCII. Aggiunto anche il controllo del valore di ritorno, la mancata impostazione dell'icona comporterà un codice di ritorno di 1.
kolen

1
È comunque possibile specificare che l'icona non ha le proporzioni modificate? Funziona benissimo, ma i file di immagine vengono rimodellati in un quadrato. Grazie!
Gustavo Bezerra,

1
Non ho trovato esattamente la risposta, ma la quadratura delle immagini con un'imbottitura trasparente prima funzionava perfettamente: stackoverflow.com/questions/12179342/…
Gustavo Bezerra,

7

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"

Grazie per quello, davvero molto utile. A proposito, sto modificando il metodo GUI, per ridurre il rumore.
Ocodo

Purtroppo la maggior parte del codice è ora obsoleta.
Mugen,

3

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

3

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'

Dettagli aggiuntivi

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/jpggenera 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.


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

2

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 .


1
Il collegamento - e MacRuby - apparentemente ora sono morti; A quanto pare MacRuby è stato sostituito dal RubyMotion commerciale, basato su abbonamento .
mklement0

2

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:

  • risoluzione del file di output
    (funziona fino a 1024x1024)
  • formato file di input
    (provato con ICNS e PNG)
  • permessi per l'installazione
    (definirlo come una funzione)

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

Benvenuti a chiedere diverso! Sembra che sarebbe meglio come commento. So che non hai ancora i punti richiesti, ma ho chiesto a qualcuno che ha il potere di venire a dare un'occhiata. Inoltre, ho scritto un Applescript che fa tutto questo per te in un pacchetto ordinato, vedi la mia risposta a una domanda simile su questo SE.
JMY1000,

Sì, ci ho provato ma non ci sono riuscito. Inoltre, penso che la seconda parte del tuo commento sarebbe migliore come risposta, non essendo correlata alla prima.
dardo82,

2

Nella recente versione di macOS (10.14), sips -i icon.pngverrà visualizzato un --addIcon is no longer supportederrore.

Ha anche bisogno di strumenti di sviluppo installati. Questo utilizza l'immagine Icon.pnge 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

0

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:

set-finder-icon

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.