Comment changer une icône de fichier ou de dossier à l'aide du terminal

54

Comment puis-je modifier ou définir l'icône d'un fichier ou d'un dossier dans le terminal, dois-je utiliser un langage de script?

ocodo
la source
Notez qu'il ne s'adapte pas bien. J'ai essayé d'appliquer des icônes à plusieurs répertoires d'un répertoire - le Finder fonctionnait très lentement.
Kolen

Réponses:

32

Vous aurez besoin des outils de développement installés, puis ce qui suit pourrait fonctionner. Cela prend le graphique icon.pnget l'applique à 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.

la source
Génial, c'est ce que je voulais.
octobre
J'ai du mal à Rez -appendtravailler avec des .avifichiers. ### Rez - Fatal error trying to open the resource file "Video.avi" for writing.`des idées?
jeudi
Il est intéressant de noter que le fichier n'a pas pu accepter une nouvelle icône via la méthode copier / coller Obtenir des informations.
octobre
Y a-t-il une restriction sur la taille de l'icône? Si j'utilise un gros jpg (1024x768), il sera redimensionné en quelque chose de vraiment petit. Puis-je conserver sa taille d'origine?
nuc
3
Notez que dans les versions récentes d'OSX, les outils de développement sont dans le $PATH(les bouts dans /usr/binqui savent où trouver les outils réels), et non /Developer/Toolsplus, vous devriez donc les invoquer juste par leurs noms de fichiers; c'est-à-dire, dans le cas présent, comme juste Rezet DeRez.
mklement0
19

Avec le bénéfice de plusieurs années de recul:

La réponse de user588 et réponse koiyu travail bien, mais ils comptent sur les services publics ( Rez, DeRezet SetFile) que:

  • ne sont pas installés par défaut (ils sont fournis avec Xcode ou les utilitaires de ligne de commande du développeur)
  • sont maintenant déconseillés ( Rezet DeRez, parce qu'ils sont liés au carbone)

osxiconutils semble intéressant, mais ne compilera plus (à partir de OSX 10.10.4) .


J'ai donc créé CLIfileicon , qui devrait fonctionner sur une machine OSX vierge (pas de prérequis) ; c'est un script Bash basé principalement sur xattr, xxdet un script Python incorporé qui appelle Cocoa, grâce à cette réponse utile .

Il permet de définir / supprimer / extraire des icônes personnalisées pour / à partir de fichiers ou de dossiers , y compris sur des volumes APFS sous macOS 10.13 (High Sierra).

Vous pouvez l'installer comme suit:

  • Si vous avez installé Node.js, à partir du registre npm , avec
    [sudo] npm install -g fileicon
  • Autrement:
    • Téléchargez la CLI en tant que fileicon(ce lien restera à jour).
    • Rendez-le exécutable avec chmod +x fileicon.
    • Déplacez-le ou faites un lien symbolique vers un dossier de votre type $PATH, tel que /usr/local/bin(requis sudo).

Voici les informations d'utilisation; pour des informations complètes, reportez-vous au manuel :

$ 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
mklement0
la source
@Slomojo: [En réponse à un commentaire supprimé depuis], je comprends que tout le monde n'a pas ou ne veut pas installer Node.js, c'est pourquoi le lien de téléchargement direct est également présent (voir l'élément de liste 'Sinon: `dans ma réponse) - c’est un script Bash autonome (la seule chose à laquelle vous vous échapperez en installant cette installation est l’installation de la page de manuel, mais vous pouvez obtenir un rendu en texte brut de la page de manuel avec fileicon --man).
mklement0
@Slomojo: [En réponse à un commentaire supprimé depuis] En ce qui concerne les raisons pour lesquelles l'installation via npm est proposée: j'ai trouvé l'écosystème npm comme étant mon gestionnaire de paquets préféré dans son ensemble et j'ai publié un certain nombre de scripts multiplates-formes. CLI basées sur ce qui ne sont pas liées à Node.js. J'ai crée aussi une seule commande, installateur de niveau utilisateur pour NPM (via n et Node.js) qui le rend facile à utiliser NPM même pour les personnes qui ont par ailleurs aucun intérêt à Node.js: curl -L http://git.io/n-install | bash.
mklement0
3
C'est une belle solution de travail prête à l'emploi. +1
user3439894
1
@PatNiemeyer: Merci, j'ai mis à jour le lien osxiconutils, mais notez que cette réponse concerne l'utilitéfileicon , qui fonctionne toujours (et, en fait, a été créée, car osxiconutilsne fonctionne plus) - j'ai mis à jour la réponse pour la rendre plus claire. .
mklement0
1
Je me rends compte que j'ai quelques années de retard sur tous les autres sur ce sujet, mais je voulais juste mentionner que j'ai découvert cela aujourd'hui et c'est génial. Merci de l'avoir fait! 👍
TJ Luoma
18

Je presque commencé une prime sur ce point , parce que je ne l' ai pas réussi à changer l'icône d'un dossier en utilisant @ Mankoff de réponse . Mais j'ai trouvé une solution.


Pour changer l'icône du dossier, vous ne pointez pas Rez -append tmp.rsrcsur le dossier mais sur un Icon\rfichier spécial à l'intérieur du dossier. Si vous n'avez jamais défini d'icône personnalisée dans le dossier, le fichier n'existera probablement pas, mais Rezil le crée à la volée. La suppression du Icon\rfichier supprime l’icône personnalisée. Il est donc préférable d’être masqué pour éviter les accidents.

Voici les modifications apportées à la réponse 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'
Jari Keinänen
la source
Et pour un dossier? Notez mon commentaire re: fichiers avi
ocodo
@slomojo désolé, mais je ne peux pas reproduire l'erreur que vous obtenez - je viens de tester la solution de mankoff avec un fichier .avi. Revérifier les autorisations de fichier et les commandes que vous avez entrées?
Jari Keinänen
Je vais faire un autre essai, j'ai peut-être déjà commis une erreur.
Octobre
J'essaie désespérément de faire cela pour une clé USB. Toutes les commandes "fonctionnent" en ce sens qu'elles ne renvoient pas d'erreurs, mais il me reste toujours une clé USB avec une icône inchangée. Toutes les pensées et je serais éternellement reconnaissant!
Singmotor
8

En plus de Ruby, voici une version 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

PyObjC est déjà préinstallé dans Python pré-installé sous Mac OS, vous n’aurez donc pas à installer de paquet.

kolen
la source
J'ai ajouté le décodage de UTF-8 à Unicode, sinon le script ne fonctionnait pas avec des noms de fichiers non-ASCII. Également ajouté la vérification de la valeur de retour, si l'icône n'est pas définie, le code de retour sera 1.
kolen
1
Y at-il de toute façon nous pouvons spécifier que l’icône n’a pas de rapport d’aspect modifié? Cela fonctionne très bien, mais les fichiers d’image sont transformés en un carré. Merci!
Gustavo Bezerra
1
Vous n'avez pas trouvé exactement la réponse, mais vous avez parfaitement ajusté les images avec un remplissage transparent avant main: stackoverflow.com/questions/12179342/…
Gustavo Bezerra Le
7

Check out setfileicon(code source) , un utilitaire créé par Damien Bobillot.

Téléchargez le binaire ici: http://maxao.free.fr/telechargements/setfileicon.gz

Après avoir décompressé le fichier, rendez-le exécutable:

chmod +x setfileicon

Ensuite, vous pouvez l'utiliser comme suit:

./setfileicon "my-icon.icns" "my-file-or-directory"
Mathias Bynens
la source
Merci pour cela, très utile. BTW, je suis en train de modifier la méthode graphique pour réduire le bruit.
Ocodo
Malheureusement, la plupart du code est maintenant obsolète.
Mugen
3

J'ai un projet github dans lequel je crée des "droplets" AppleScript à partir de scripts [shell / bash, python, perl, ruby, etc.] qui prennent les chemins de fichiers comme arguments. J'ai écrit cette fonction bash pour changer l'icône d'un dossier (car les ensembles AppleScript sont des dossiers avec une extension .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'
}

Une fois défini, vous appelez la fonction avec 2 arguments:

replace_icon /path/to/AppleScript.app /path/to/icon.png

ou

replace_icon /path/to/AppleScript.app http://i.imgur.com/LmUvWqB.png

Comme vous pouvez le voir, le deuxième argument peut être une image sur votre système ou une URL.

Remarque: cette $'/Icon\r'chose folle à la recherche que je fais est parce que le nom du fichier Icon se termine par un retour chariot littéral\r . Voyez vous-même avec:

find my-applescript.app -maxdepth 1 | less -U
Bruno Bronosky
la source
3

En supposant que nous ayons déjà icns-file. Créez un fichier de ressources temporaire pointant vers icns-file:

$ echo "read 'icns' (-16455) \"Icon.icns\";" >> Icon.rsrc

Ajoutez le fichier de ressources en tant que valeur de l'attribut étendu "com.apple.ResourceFork" à un fichier:

$ Rez -a Icon.rsrc -o FileName.ext

Affiche l'icône du fichier:

$ SetFile -a C FileName.ext

Ajoutez le fichier de ressources en tant que valeur de l'attribut étendu "com.apple.ResourceFork" à un fichier d'icône magique dans le dossier actuel:

$ Rez -a Icon.rsrc -o Icon$'\r'

Afficher l'icône du dossier actuel:

$ SetFile -a C .

Masquer le fichier d'icône magique dans le dossier actuel (appuyez sur ⇧⌘. Pour afficher / masquer les fichiers cachés dans le Finder):

$ SetFile -a V Icon$'\r'

Détails supplémentaires

Les données d'icône sont stockées en tant que valeur de l'attribut étendu "com.apple.ResourceFork" (la commande du terminal "xattr -p com.apple.ResourceFork FileName.ext" imprime la valeur). Pour un dossier, il y a un fichier magique (vide et caché) Icon$'\r'dans le dossier. Pour extraire les données d'icône de l'attribut étendu "com.apple.ResourceFork" dans un fichier de ressources en texte brut (à partir duquel nous connaissons le bon identificateur de type icns "-16455"):

$ DeRez -only icns FileWithIcon.ext > Icon.rsrc
$ DeRez -only icns /Folder/With/Icon/Icon$'\r' > Icon.rsrc

Sous macOS 10.13, la commande High Sierra $ sips -i ImageFile.icns/png/jpggénère l'erreur "--addIcon n'est plus pris en charge". Basculez "-i" signifie "--addIcon" en tant qu'attribut étendu "com.apple.ResourceFork" sur ce fichier lui-même en utilisant le contenu de ce fichier image.

Sergii Kryzhanovskyi
la source
# <stdin>: 1: ### /Applications/Xcode.app/Contents/Developer/usr/bin/Rez - SysError 0 pendant la lecture.
quanta
2

Une autre option consiste à utiliser MacRuby:

/usr/local/bin/macruby -e 'framework "Cocoa";NSWorkspace.sharedWorkspace.setIcon(NSImage.alloc.initWithContentsOfFile("/tmp/a.png"),forFile:"/tmp/file",options:0)'

Vous pouvez télécharger un programme d'installation pour MacRuby à l' adresse http://macruby.org .

Lri
la source
1
Le lien - et MacRuby - sont apparemment maintenant morts; MacRuby a apparemment été remplacé par RubyMotion , un abonnement commercial .
mklement0
2

Curieusement, la meilleure solution semble ne pas utiliser les outils propres à Apple, mais le code Python, car il présente divers avantages, sans être limité par:

  • résolution du fichier de sortie
    (cela fonctionne jusqu'à 1024x1024)
  • format de fichier d'entrée
    (essayé avec ICNS et PNG)
  • autorisations d'installation
    (définissez-le comme une fonction)

Mise à jour

Maintenant (sur macOS Sierra) La réponse de @ koiyu semble fonctionner, vous pouvez donc utiliser cette double couche pour copier l'icône d'un dossier source vers votre dossier de destination:

#!/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
dardo82
la source
Bienvenue à Ask Different! Cela semble être mieux comme commentaire. Je sais que vous n'avez pas encore les points requis, mais j'ai demandé à quelqu'un qui a le pouvoir de venir jeter un coup d'œil. De plus, j'ai écrit un AppleScript qui résume tout cela pour vous. Voir ma réponse à une question similaire sur cette SE.
JMY1000
Oui, j'ai essayé mais je ne pouvais pas le faire. De plus, je pense que la deuxième partie de votre commentaire serait meilleure comme réponse, sans rapport avec la première.
Dardo82
2

Dans la version récente de macOS (10.14), sips -i icon.pngune --addIcon is no longer supportederreur se produira .

Les outils de développement doivent également être installés. Ceci utilise le graphique dans Icon.pnget l’applique à file.ext, tout comme la réponse 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
FradSer
la source
0

Tout comme la solution Python utilisant PyObjC, il s'avère que cela peut être fait uniquement avec AppleScript (qui n'est pas obsolète dans Catalina 10.15, contrairement à Python et à d'autres langages de script).

J'ai trouvé un exemple de comment faire cela sur GitHub ici:

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 n'est pas facile à lire, mais il est apparemment possible d'accéder au code Objective-C via le framework AppKit.

Alexander O'Mara
la source