74 votes

Comment modifier l'icône d'un fichier ou d'un dossier à l'aide du terminal ?

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 ?

3voto

Bruno Bronosky Points 541

J'ai un projet github où je crée des "droplets" AppleScript à partir de [shell/bash, Python, perl, ruby, etc.] scripts qui prennent des chemins de fichiers comme arguments. J'ai écrit cette fonction bash pour changer l'icône d'un dossier (parce que les bundles 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éfinie, vous appelez la fonction avec 2 arguments :

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

o

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.

NOTE : Ce regard fou $'/Icon\r' que je fais, c'est que le nom du fichier Icon se termine par un littéral retour à la ligne \r . Voyez par vous-même avec :

find my-applescript.app -maxdepth 1 | less -U

3voto

En supposant que nous avons déjà le fichier icns. Créer un fichier de ressources temporaire qui pointe vers le fichier icns :

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

Ajoute le fichier de ressources comme 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

Ajoute le fichier de ressources comme 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'

Affiche l'icône du dossier en cours :

$ SetFile -a C .

Cachez le fichier de l'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 de l'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 existe un fichier magique (qui est vide et caché) Icon$'\r' à l'intérieur du dossier. Pour extraire les données de l'icône de l'attribut étendu "com.apple.ResourceFork" dans un fichier de ressources en texte brut (dont nous connaissons l'identifiant de type icns correct "-16455") :

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

Sous MacOS 10.13 High Sierra, commande $ sips -i ImageFile.icns/png/jpg génère l'erreur "--addIcon is no longer supported". Le commutateur "-i" signifie "--addIcon" comme attribut étendu "com.apple.ResourceFork" sur ce fichier lui-même en utilisant le contenu de ce fichier image.

2voto

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 installateur pour MacRuby à partir de http://macruby.org .

2voto

dardo82 Points 118

Curieusement, la meilleure solution semble être de ne pas utiliser les outils d'Apple, mais le code Python, car il présente de nombreux avantages, notamment celui de ne pas être limité par les outils d'Apple :

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

Mise à jour

Maintenant (sur MacOS Sierra) la réponse de @koiyu semble fonctionner, donc vous pourriez utiliser cette double ligne 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

2voto

FradSer Points 41

Dans la version récente de MacOS (10.14), sips -i icon.png obtiendra un --addIcon is no longer supported erreur.

Il faut également installer les Developer Tools. Il utilise le graphique dans Icon.png et 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

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X