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

49

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

    
posta ocodo 25.01.2011 - 00:21
fonte

9 risposte

30

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.
    
risposta data 25.01.2011 - 00:49
fonte
18

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'
    
risposta data 11.03.2011 - 13:56
fonte
16

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:

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

  • Se hai installato Node.js, dal registro di npm , con
    [sudo] npm install -g fileicon
  • In caso contrario:
    • Scarica la CLI come fileicon (questo link rimarrà aggiornato).
    • Rendilo eseguibile con chmod +x fileicon .
    • Spostalo o link simbolico a una cartella in $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
    
risposta data 04.08.2015 - 04:29
fonte
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 che è preinstallato in Mac OS ha già PyObjC quindi non devi installare alcun pacchetto.

    
risposta data 15.12.2014 - 22:19
fonte
7

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"
    
risposta data 23.03.2012 - 21:51
fonte
3

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
    
risposta data 25.03.2013 - 19:26
fonte
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 dal link .

    
risposta data 25.02.2014 - 20:33
fonte
2

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'

Ulteriori dettagli

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.

    
risposta data 21.06.2018 - 21:34
fonte
1

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:

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

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
    
risposta data 20.05.2016 - 03:31
fonte

Leggi altre domande sui tag