Wie kann ich ein Datei- oder Ordnersymbol mit dem Terminal ändern

Wie kann ich das Symbol für eine Datei oder einen Ordner im Terminal ändern oder festlegen, muss ich eine Skriptsprache verwenden?

Beachten Sie, dass es nicht gut skaliert. Versucht, Symbole auf viele Verzeichnisse in einem Verzeichnis anzuwenden – Finder arbeitete sehr langsam.

Antworten (12)

Sie müssen die Developer Tools installiert haben, und dann könnte Folgendes funktionieren. Dies nimmt die Grafik auf icon.pngund wendet sie auf an 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.
Super, genau das wollte ich.
Ich habe Probleme Rez -appendbeim Arbeiten mit .aviDateien. ### Rez - Fatal error trying to open the resource file "Video.avi" for writing.` Irgendwelche Ideen?
Interessanterweise konnte die Datei auch kein neues Symbol über die Copy/Paste-Methode von Get Info akzeptieren.
Gibt es eine Beschränkung der Symbolgröße? Wenn ich ein großes JPG (1024 x 768) verwende, wird die Größe auf etwas wirklich Kleines geändert. Kann ich irgendwie seine Originalgröße beibehalten?
@nuc OS X unterstützt eine Symbolgröße von maximal 512 x 512, daher sehe ich keinen Sinn (nun, vielleicht außer der Zukunftssicherheit), es größer zu speichern. Und während Sie sich an der Befehlszeile befinden, können Sie die längste Länge des Bildes auf 512 ändern, zB mit sips: sips -Z 512 image.png --out smaller-image.png(wenn Sie jedoch die Kontrolle über die Resampling-Algorithmen haben möchten, ist eine Bildverarbeitungssoftware vielleicht eine bessere Idee).
Beachten Sie, dass sich die Entwicklertools in den neueren OSX-Versionen im $PATH(Stubs in /usr/bin, die wissen, wo die eigentlichen Tools zu finden sind) und nicht /Developer/Toolsmehr im Verzeichnis befinden, also sollten Sie sie nur über ihre Dateinamen aufrufen; dh im vorliegenden Fall als gerade Rezund DeRez.
macOS unterstützt quadratische Symboldateien mit Auflösungen bis zu 1024 x 1024
Vielen Dank Alter! Das habe ich schon oft gesucht...

Mit dem Vorteil mehrerer Jahre Rückblick:

Die Antwort von user588 und koiyus funktionieren gut, aber sie verlassen sich auf Dienstprogramme ( Rez, DeRezund SetFile), die:

  • werden nicht standardmäßig installiert (sie werden entweder mit Xcode oder den Entwickler-Befehlszeilendienstprogrammen geliefert)
  • sind jetzt veraltet ( Rezund DeRez, weil sie sich auf Carbon beziehen)

osxiconutils sehen interessant aus, lassen sich aber nicht mehr kompilieren (ab macOS 10.10.4) .


Daher habe ich CLIfileicon erstellt , das auf einer ursprünglichen OSX-Maschine funktionieren sollte (keine Voraussetzungen) ; Es ist ein Bash-Skript, das hauptsächlich auf basiert xattr, xxdund ein eingebettetes Python-Skript, das Cocoa mit freundlicher Genehmigung dieser hilfreichen Antwort aufruft .

Es ermöglicht das Einstellen/Entfernen/Extrahieren benutzerdefinierter Symbole für/aus Dateien oder Ordnern , einschließlich auf APFS-Volumes unter macOS 10.13 (High Sierra).

Sie können es wie folgt installieren:

  • Wenn Sie Homebrew installiert haben:brew install fileicon

  • Wenn Sie Node.js installiert haben, aus der npm-Registrierung mit
    [sudo] npm install -g fileicon

  • Andernfalls:

    • Laden Sie die CLI herunter als fileicon(dieser Link bleibt aktuell).
    • Mit ausführbar machen chmod +x fileicon.
      • Verschieben Sie es oder verknüpfen Sie es mit einem Symlink in einen Ordner in Ihrer $PATH, z. B. /usr/local/bin(erfordert sudo).

Hier sind die Nutzungsinformationen; Vollständige Informationen finden Sie im Handbuch :

$ 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
@Slomojo: [Als Antwort auf einen seitdem gelöschten Kommentar] Ich verstehe, dass nicht jeder Node.js installiert hat oder installieren möchte, deshalb ist auch der direkte Download-Link dort (siehe den Listenpunkt "Ansonsten:" in meiner Antwort) - Es ist ein eigenständiges Bash-Skript (das einzige, worauf Sie bei dieser Installation verzichten, ist die Installation der Manpage, aber Sie können eine Klartext-Darstellung der Manpage mit erhalten fileicon --man).
@Slomojo: [Als Antwort auf einen seitdem gelöschten Kommentar] Warum die Installation über npm angeboten wird: Ich habe festgestellt, dass das npm-Ökosystem insgesamt mein bevorzugter Paketmanager ist, und ich habe eine Reihe von plattformübergreifenden Skripten veröffentlicht -basierte CLIs, die nicht Node.js-bezogen sind. Ich habe auch ein Installationsprogramm auf Benutzerebene mit einem Befehl für npm (über n und Node.js) erstellt , das die Verwendung von npm auch für Personen vereinfacht, die ansonsten kein Interesse an Node.js haben: curl -L http://git.io/n-install | bash.
Dies ist eine schöne, sofort einsatzbereite Lösung. +1
Dies funktioniert nicht mehr in 10.10. Das Projekt wurde auf github verschoben: github.com/sveinbjornt/osxiconutils , wenn Sie nach einem Update suchen möchten.
@PatNiemeyer: Danke, ich habe den Link osxiconutils aktualisiert, aber beachten Sie, dass es in dieser Antwort um das Dienstprogrammfileicon geht, das immer noch funktioniert (und tatsächlich erstellt wurde, weil osxiconutilses nicht mehr funktioniert) - ich habe die Antwort aktualisiert, um das klarer zu machen .
Mir ist klar, dass ich allen anderen in diesem Thread ein paar Jahre hinterherhinke, aber ich wollte nur erwähnen, dass ich das heute entdeckt habe und es großartig ist. Vielen Dank, dass Sie es geschafft haben! 👍
Funktioniert sehr gut

Ich hätte fast ein Kopfgeld dafür gestartet, weil ich es nicht geschafft habe, das Symbol eines Ordners mit der Antwort von @ mankoff zu ändern . Aber ich habe eine Lösung gefunden.


Um das Ordnersymbol zu ändern, zeigen Sie nicht Rez -append tmp.rsrcauf den Ordner, sondern auf eine spezielle Icon\rDatei innerhalb des Ordners. Wenn Sie zuvor noch kein benutzerdefiniertes Symbol für den Ordner festgelegt haben, wird die Datei wahrscheinlich nicht existieren, aber Rezsie wird im laufenden Betrieb erstellt. Durch das Löschen der Icon\rDatei wird das benutzerdefinierte Symbol entfernt. Um Unfälle zu vermeiden, ist es gut, es auszublenden.

Dies sind die Änderungen an der Antwort des 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'
Und für eine Datei? Beachten Sie meinen Kommentar zu: avi-Dateien
@slomojo Entschuldigung, aber ich kann den Fehler, den Sie erhalten, nicht replizieren - habe gerade die Mankoff-Lösung mit einer .avi-Datei getestet. Die eingegebenen Dateiberechtigungen und Befehle erneut überprüfen?
Ich werde es noch einmal versuchen, vielleicht habe ich vorher einen Fehler gemacht.
Ich versuche verzweifelt, dies für einen USB-Stick zu tun. Alle Befehle "funktionieren", da sie keine Fehler zurückgeben, aber ich habe immer noch einen USB-Stick mit einem unveränderten Symbol. Irgendwelche Gedanken und ich wäre ewig dankbar!

Zusätzlich zu Ruby ist hier eine Python-Version:

#!/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, das in Mac OS vorinstalliert ist, verfügt bereits über PyObjC, sodass Sie keine Pakete installieren müssen.

Ich habe die Dekodierung von UTF-8 zu Unicode hinzugefügt, ansonsten funktionierte das Skript nicht mit Nicht-ASCII-Dateinamen. Außerdem wurde eine Überprüfung des Rückgabewerts hinzugefügt, ein Fehler beim Setzen des Symbols führt zu einem Rückgabecode von 1.
Können wir trotzdem angeben, dass das Seitenverhältnis des Symbols nicht geändert wurde? Es funktioniert großartig, aber Bilddateien werden zu einem Quadrat umgeformt. Danke!
Ich habe die Antwort nicht genau gefunden, aber das Quadrieren der Bilder mit transparenter Polsterung vor der Hand funktionierte einwandfrei: stackoverflow.com/questions/12179342/…
Ich verstehe, dass Python bei der Veröffentlichung von macOS Big Sur entfernt wird. Würde das noch funktionieren?

Schauen Sie sich setfileicon(Quellcode) an, ein von Damien Bobillot erstelltes Dienstprogramm.

Laden Sie die Binärdatei hier herunter: http://maxao.free.fr/telechargements/setfileicon.gz

Nachdem Sie die Datei entpackt haben, machen Sie sie ausführbar:

chmod +x setfileicon

Dann können Sie es wie folgt verwenden:

./setfileicon "my-icon.icns" "my-file-or-directory"
Danke dafür, wirklich sehr hilfreich. Übrigens bearbeite ich die GUI-Methode, um Rauschen zu reduzieren.
Leider ist der meiste Code jetzt veraltet.

Ich habe ein Github-Projekt, in dem ich AppleScript-„Droplets“ aus [Shell/Bash, Python, Perl, Ruby usw.]-Skripten erstelle, die Dateipfade als Argumente verwenden. Ich habe diese Bash-Funktion geschrieben, um das Symbol eines Ordners zu ändern (weil AppleScript-Bundles Ordner mit der Erweiterung .app sind).

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'
}

Nach der Definition rufen Sie die Funktion mit 2 Argumenten auf:

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

oder

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

Wie Sie sehen können, kann das zweite Argument ein Bild auf Ihrem System oder eine URL sein.

HINWEIS: Das verrückt aussehende $'/Icon\r'Ding, das ich mache, liegt daran, dass der Name der Icon-Datei mit einem wörtlichen Wagenrücklauf endet \r. Überzeugen Sie sich selbst mit:

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

Angenommen, wir haben bereits eine icns-Datei. Erstellen Sie eine temporäre Ressourcendatei, die auf die icns-Datei verweist:

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

Hängen Sie die Ressourcendatei als Wert des erweiterten Attributs „com.apple.ResourceFork“ an eine Datei an:

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

Zeigen Sie das Symbol der Datei an:

$ SetFile -a C FileName.ext

Hängen Sie die Ressourcendatei als Wert des erweiterten Attributs „com.apple.ResourceFork“ an eine magische Symboldatei im aktuellen Ordner an:

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

Symbol des aktuellen Ordners anzeigen:

$ SetFile -a C .

Verstecken Sie die magische Symboldatei im aktuellen Ordner (drücken Sie ⇧⌘., um versteckte Dateien im Finder anzuzeigen/auszublenden):

$ SetFile -a V Icon$'\r'

Weitere Details

Symboldaten werden als Wert des erweiterten Attributs „com.apple.ResourceFork“ gespeichert (das Terminalkommando „xattr -p com.apple.ResourceFork FileName.ext“ gibt den Wert aus). Für einen Ordner gibt es eine magische (leere und versteckte) Datei Icon$'\r'im Ordner. So extrahieren Sie Symboldaten aus dem erweiterten Attribut „com.apple.ResourceFork“ in eine Nur-Text-Ressourcendatei (aus der wir die korrekte icns-Typkennung „-16455“ kennen):

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

Unter macOS 10.13 High Sierra $ sips -i ImageFile.icns/png/jpgerzeugt der Befehl den Fehler „--addIcon wird nicht mehr unterstützt“. Schalter "-i" bedeutet "--addIcon" als erweitertes Attribut "com.apple.ResourceFork" auf diese Datei selbst unter Verwendung des Inhalts dieser Bilddatei.

#<stdin>:1: ### /Applications/Xcode.app/Contents/Developer/usr/bin/Rez - SysError 0 während des Lesens.

Eine andere Möglichkeit ist die Verwendung von MacRuby:

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

Sie können ein Installationsprogramm für MacRuby von http://macruby.org herunterladen .

Der Link – und MacRuby – sind anscheinend jetzt tot; Auf MacRuby folgte offenbar das kommerzielle, abonnementbasierte RubyMotion .

Seltsamerweise scheint die beste Lösung zu sein, nicht Apples eigene Tools zu verwenden, sondern den Python-Code, da er verschiedene Vorteile hat, die nicht eingeschränkt werden durch:

  • Auflösung der Ausgabedatei
    (funktioniert bis 1024x1024)
  • Eingabedateiformat
    (versucht mit ICNS und PNG)
  • Berechtigungen zum Installieren
    (als Funktion definieren)

Aktualisieren

Jetzt (unter macOS Sierra) scheint die Antwort von @koiyu zu funktionieren, sodass Sie diesen Zweizeiler verwenden können, um das Symbol von einem Quellordner in Ihren Zielordner zu kopieren:

#!/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
Willkommen bei Ask Different! Dies scheint als Kommentar besser zu sein. Ich weiß, dass Sie noch nicht über die erforderlichen Punkte verfügen, aber ich habe jemanden gebeten, der die Macht hat, sich das anzusehen. Außerdem habe ich ein Applescript geschrieben, das all dies in einem ordentlichen Bündel für Sie erledigt, siehe meine Antwort auf eine ähnliche Frage zu diesem SE.
Ja, ich habe es versucht, konnte es aber nicht. Außerdem denke ich, dass der 2. Teil Ihres Kommentars besser als Antwort wäre, da er nicht mit dem 1. zusammenhängt.

Ähnlich wie bei der Python-Lösung mit PyObjC stellt sich heraus, dass dies nur mit AppleScript möglich ist (das in 10.15 Catalina nicht veraltet ist, im Gegensatz zu Python und anderen Skriptsprachen).

Ich habe hier auf GitHub ein Beispiel dafür gefunden:

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 ist nicht einfach zu lesen, aber anscheinend ist es möglich, über das AppKit-Framework auf den Objective-C-Code zuzugreifen, um dies zu tun.

Das ist klasse. Ich danke Ihnen sehr. Ich konnte dieses Skript sogar aus Java-Code ausführen und es funktioniert einwandfrei.

In der aktuellen macOS-Version (10.14) sips -i icon.pngwird ein --addIcon is no longer supportedFehler angezeigt.

Außerdem müssen die Entwicklertools installiert sein. Dies verwendet die Grafik in Icon.pngund wendet sie auf an file.ext, genau wie die Antwort von 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
Ich bekomme Error: Unable to write image to file /Users/uname/tmpicns.icns.4rzX6den ersten Befehl. Ich versuche es sogar mit sudo, funktioniert nicht
Ich habe das gleiche Problem wie @leetbacoon . Weiß jemand warum?
@leetbacoon Siehe blog.macsales.com/… für Informationen zum Konvertieren eines Iconset-Ordners in eine ICNS-Datei. Wenn Sie den Iconset-Ordner programmgesteuert erstellen und mit PNG-Dateien füllen müssen, verwenden Sie sips -z x x input.png -o output.pngwobei x die Höhe bzw. Breite des Bildes ist. Dadurch wird eine Kopie von input.png mit der angegebenen Höhe und Breite erstellt. Stellen Sie dann einfach sicher, dass sich die Ausgabedatei im Iconset-Ordner befindet.
Vielen Dank, dass Sie mich @PeterSchorn wissen lassen.

Es gibt eine Art Fehler (der in Ordnern innerhalb der iCloud-Synchronisierung auftritt) mit der Änderung der Symbole von "Ordnern" oder Dateien, zuletzt in Catalina: Wenn sich das Symbol ändert, aktualisiert die Benutzeroberfläche den Ordner nicht mit dem neuen Symbol wenn es ein älteres hat. Wenn Sie also zum zweiten Mal ein Symbol festlegen, wird es nicht immer aktualisiert. Selbst wenn Sie es manuell mit cmd+i machen und ein zuvor kopiertes Bild als Symbol einfügen, spielt die iCloud damit verrückt.

Als ich nach einer Problemumgehung suchte, fand ich diesen kleinen Fix (nicht ideal, aber funktioniert): - Dies ist in JXA Javascript für die Automatisierung

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);
}

Die Idee des "Tricks" besteht darin, eine Datei in dem Ordner zu erstellen, bevor Sie das Symbol ändern, um die iCloud zum Synchronisieren zu zwingen, und dann 1 Sekunde warten, um die Datei zu löschen.

Sie müssen touchden Ordner für den Finder erneut rendern.
Ich versuche, aber es ändert sporadisch das Symbol, beim ersten Mal funktioniert es immer, aber nicht, wenn der Ordner ein Symbol bereit hat. Endlich ist das in Catalina passiert.
Ich denke darüber nach, wie Sie sagen ... und ich habe den Fehler gefunden. Das Problem ist, dass bei Ordnern, die sich in den iCloud-Synchronisierungsordnern befinden, dies bei anderen Ordnern nicht der Fall ist, die nur mit Berührung benötigt werden.
Aktualisierter Code → Es wurde eine schnelle Möglichkeit gefunden, das Symbol zu aktualisieren, wenn sich der Ordner in iCloud befindet.