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 ?

2voto

Alexander O'Mara Points 2685

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

J'ai trouvé un exemple de la manière de procéder 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

L'AppleScript n'est pas facile à lire, mais il est apparemment possible d'accéder au code Objective-C pour faire cela via le framework AppKit.

1voto

microbians Points 111

Il y a une sorte de bug (qui se produit dans les dossiers dans le cadre de la synchronisation iCloud) avec le changement d'icônes des "dossiers" ou des fichiers, enfin dans Catalina : Quand l'icône change, l'interface ne rafraîchit pas le dossier avec la nouvelle icône quand il en a une plus ancienne. Ainsi, la deuxième fois que vous définissez une icône, elle ne se rafraîchit pas tout le temps. Même si vous le faites manuellement avec cmd+i et en collant une image précédemment copiée comme icône, iCloud devient fou avec cela.

En cherchant une solution de contournement, j'ai trouvé cette petite correction (pas idéale mais qui fonctionne) : - ceci est en Javascript JXA pour l'automatisation

function makeIcon(theFolder, theFile) {
    var img = $.NSImage.alloc.initByReferencingFile( theFile );
    var updateUUID = newUUID()+".txt";
    terminal("echo -n > "+ sanityzeForBash(theFolder+"/Icon\r") );
    terminal("rm "+ sanityzeForBash(theFolder+"/Icon\r") ); 
    writeTextFile(theFolder+"/"+updateUUID, "_"); 
    $.NSWorkspace.sharedWorkspace.setIconForFileOptions(img, theFolder, 0);
    delay(1);
    terminal("rm "+ sanityzeForBash(theFolder+"/"+updateUUID) );
}

function writeTextFile(fileName, text) {
    var file = app.openForAccess(Path(fileName), { writePermission: true })
    app.setEof(file, { to: 0 });
    app.write( getProperties(text) +"\n\r", { to: file, startingAt: app.getEof(file) })
    app.closeAccess(file)
    return true;
}

function sanityzeForBash(s) {
    return "'"+ s.replace("'","\\'") +"'";
}

function newUUID(){
    return ObjC.unwrap($.NSUUID.UUID.UUIDString);
}

function terminal(c) {
    var app = Application.currentApplication();
    app.includeStandardAdditions = true;
    return app.doShellScript(c);
}

L'idée du "truc" est de créer un fichier à l'intérieur du dossier avant de changer l'icône pour forcer la synchronisation avec iCloud, puis d'attendre 1s pour supprimer le fichier.

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