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 ?
Réponses
Trop de publicités?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
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.
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 .
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
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