Wie kann ich ein Datei- oder Ordnersymbol über das Terminal ändern?

53

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

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

Antworten:

31

Sie müssen die Entwicklertools installiert haben, und dann funktioniert möglicherweise Folgendes. Dies nimmt die Grafik auf icon.pngund wendet sie 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.

quelle
Genial, genau das wollte ich.
Ocodo
Ich habe Probleme Rez -appendbeim Arbeiten mit .aviDateien. ### Rez - Fatal error trying to open the resource file "Video.avi" for writing.Irgendwelche Ideen?
ocodo
Interessanterweise konnte die Datei auch kein neues Symbol über die Methode zum Kopieren / Einfügen von Informationen akzeptieren.
ocodo
Gibt es eine Beschränkung für die Symbolgröße? Wenn ich ein großes JPG (1024x768) verwende, wird es auf eine sehr kleine Größe geändert. Kann ich irgendwie seine ursprüngliche Größe beibehalten?
NUC
2
Beachten Sie, dass sich in neueren OSX-Versionen die Entwicklertools in $PATH(Stubs /usr/bin, die wissen, wo sich die eigentlichen Tools befinden) und nicht /Developer/Toolsmehr in befinden. Sie sollten sie daher nur über ihre Dateinamen aufrufen. dh im vorliegenden Fall als gerecht Rezund DeRez.
mklement0
19

Mit dem Vorteil einer mehrjährigen Rückschau:

user588 Antwort und Antwort der koiyu Arbeit gut, aber sie verlassen sich auf Dienstprogramme ( Rez, DeRez, und SetFile) , dass:

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

osxiconutils sehen interessant aus, werden aber nicht mehr kompiliert (ab OSX 10.10.4) .


Daher habe ich eine CLIfileicon erstellt , die auf einem makellosen OSX-Computer funktionieren sollte (keine Voraussetzungen) . es ist ein Bash - Skript in erster Linie auf der Grundlage xattr, xxdund ein eingebetteter Python - Skript , das Cocoa, mit freundlicher Genehmigung von nennt diese hilfreichen Antwort .

Es ermöglicht das Setzen / Entfernen / Extrahieren von benutzerdefinierten Symbolen 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 Node.js installiert haben, aus der npm-Registrierung mit
    [sudo] npm install -g fileicon
  • Andernfalls:
    • Laden Sie die CLI als herunter fileicon(dieser Link bleibt aktuell).
    • Machen Sie es ausführbar mit chmod +x fileicon.
    • Verschieben oder verknüpfen Sie es mit einem Ordner in Ihrem Ordner $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
mklement0
quelle
@Slomojo: [Als Antwort auf einen seitdem gelöschten Kommentar] Ich habe festgestellt, dass nicht jeder Node.js installiert hat oder installieren möchte. Deshalb gibt es auch den direkten Download-Link (siehe den Listeneintrag "Sonst:" in meiner Antwort). - Es ist ein in sich geschlossenes Bash-Skript (das einzige, worauf Sie bei dieser Installation verzichten müssen, ist die Installation der Manpage, aber Sie können eine Klartext-Darstellung der Manualpage mit erhalten fileicon --man).
mklement0
@Slomojo: [Als Antwort auf einen seitdem gelöschten Kommentar] Warum wird die Installation über npm angeboten? -basierte CLIs, die nicht mit Node.js zusammenhängen. Ich habe auch eine erstellen Single-Befehl, auf Benutzerebene Installer für NPM (über n und Node.js) , die es macht einfach , auch für Menschen verwenden npm , die sonst kein Interesse an Node.js haben: curl -L http://git.io/n-install | bash.
mklement0
3
Dies ist eine sofort einsatzbereite Lösung. +1
user3439894
1
@PatNiemeyer: Danke, ich habe den Link osxiconutils aktualisiert. Beachten Sie jedoch, dass es sich bei dieser Antwort um ein Hilfsprogramm handeltfileicon , das immer noch funktioniert (und tatsächlich erstellt wurde, weil es osxiconutilsnicht mehr funktioniert). Ich habe die Antwort aktualisiert, um dies klarer zu machen .
mklement0
1
Mir ist klar, dass ich in diesem Thread ein paar Jahre hinter allen anderen zurück bin, aber ich wollte nur erwähnen, dass ich das heute entdeckt habe und es großartig ist. Danke, dass du es geschafft hast! 👍
TJ Luoma
18

Ich fast ein Kopfgeld auf diese begann, weil ich nicht das Symbol eines ändern schaffte Ordner mit @ mankoff ‚s Antwort . 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 im Ordner. Wenn Sie dem Ordner noch kein benutzerdefiniertes Symbol zugewiesen haben, ist die Datei wahrscheinlich nicht vorhanden, Rezerstellt sie jedoch sofort. Wenn Sie die Icon\rDatei löschen , wird das benutzerdefinierte Symbol entfernt. Um Unfälle zu vermeiden, sollten Sie es ausblenden.

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'
Jari Keinänen
quelle
Und für eine Akte? Beachten Sie meinen Kommentar zu:
AVI-
@slomojo Entschuldigung, aber ich kann den Fehler, den Sie erhalten, nicht replizieren. Ich habe nur die Lösung von mankoff mit einer .avi-Datei getestet. Überprüfen Sie die eingegebenen Dateiberechtigungen und Befehle erneut.
Jari Keinänen
Ich werde es noch einmal versuchen, vielleicht habe ich vorher einen Fehler gemacht.
ocodo
Ich versuche verzweifelt, dies für einen USB-Stick zu tun. Alle Befehle "funktionieren" dahingehend, dass 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!
Singmotor
8

Zusätzlich zu Ruby gibt es 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

In Python, das unter Mac OS vorinstalliert ist, ist PyObjC bereits vorhanden, sodass Sie keine Pakete installieren müssen.

kolen
quelle
Ich habe Unicode um die Dekodierung von UTF-8 erweitert, ansonsten funktionierte das Skript nicht mit Nicht-ASCII-Dateinamen. Eine Überprüfung des Rückgabewerts wurde ebenfalls hinzugefügt. Wird das Symbol nicht gesetzt, wird der Rückgabecode 1
angezeigt.
1
Gibt es sowieso wir können das Icon nicht modifizieren lassen? Es funktioniert prima, aber Bilddateien werden in ein Quadrat umgewandelt. Vielen Dank!
Gustavo Bezerra
1
Ich habe
Gustavo Bezerra
7

Check out setfileicon(Quellcode) , ein Dienstprogramm, das von Damien Bobillot erstellt wurde.

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

Machen Sie die Datei nach dem Entpacken ausführbar:

chmod +x setfileicon

Dann können Sie es wie folgt verwenden:

./setfileicon "my-icon.icns" "my-file-or-directory"
Mathias Bynens
quelle
Vielen Dank dafür, sehr hilfreich. Übrigens bearbeite ich die GUI-Methode, um Rauschen zu reduzieren.
Ocodo
Leider ist der meiste Code mittlerweile veraltet.
Mugen
3

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

Einmal definiert, 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, kann das zweite Argument ein Bild auf Ihrem System oder eine URL sein.

HINWEIS: Das verrückte Aussehen $'/Icon\r', das ich mache, ist, weil 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
Bruno Bronosky
quelle
3

Vorausgesetzt, wir haben bereits eine icns-Datei. Erstellen Sie eine temporäre Ressourcendatei, die auf icns-file 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änge 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'

Zeigt das Symbol des aktuellen Ordners an:

$ SetFile -a C .

Verstecke die magische Symboldatei im aktuellen Ordner (drücke ⇧⌘., Um versteckte Dateien im Finder anzuzeigen / auszublenden):

$ SetFile -a V Icon$'\r'

Zusätzliche Details

Symboldaten werden als Wert des erweiterten Attributs "com.apple.ResourceFork" gespeichert (Terminalbefehl "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 die korrekte ICNS-Typ-ID "-16455" bekannt ist):

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

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

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

Eine andere Option 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 .

Lri
quelle
1
Die Verbindung - und MacRuby - sind anscheinend jetzt tot; MacRuby wurde anscheinend von der kommerziellen, abonnementbasierten RubyMotion abgelöst .
mklement0
2

Seltsamerweise scheint die beste Lösung nicht die Verwendung von Apples eigenen Tools zu sein, sondern des Python-Codes, da er verschiedene Vorteile bietet, die nicht durch Folgendes eingeschränkt werden:

  • Ausgabedateiauflösung
    (funktioniert bis 1024x1024)
  • Eingabedateiformat
    (versucht mit ICNS und PNG)
  • Installationsberechtigungen
    (als Funktion definieren)

Aktualisieren

Jetzt (unter macOS Sierra) scheint die Antwort von @ koiyu zu funktionieren. Sie können also diesen Doppelliner verwenden, um das Symbol aus 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
dardo82
quelle
Willkommen bei Ask Different! Dies scheint als Kommentar besser zu sein. Ich weiß, dass Sie noch nicht die erforderlichen Punkte haben, aber ich habe jemanden gefragt, der die Macht hat, einen Blick darauf zu werfen. Außerdem habe ich ein Applescript geschrieben, das all dies in einem übersichtlichen Paket für Sie erledigt. Siehe meine Antwort auf eine ähnliche Frage zu dieser SE.
JMY1000,
Ja, ich habe es versucht, konnte es aber nicht. Darüber hinaus denke ich, dass der 2. Teil Ihres Kommentars als Antwort besser wäre, da er nicht mit dem 1. Teil zusammenhängt.
Dardo82
2

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

Außerdem mussten Entwicklertools installiert sein. Dies nimmt die Grafik auf Icon.pngund wendet sie an file.ext, genau wie die Antwort von user588 :

# Covert Icon.png to tempicons.icns:
sips -s format icns Icon.png --out tmpicns.icns

# Create temp resource file which points to tempicons.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 tempicons.icns && rm tmpicns.rsrc
FradSer
quelle
0

Ähnlich wie bei der Python-Lösung mit PyObjC kann sie nur mit AppleScript ausgeführt werden (das in 10.15 Catalina im Gegensatz zu Python und anderen Skriptsprachen nicht veraltet ist).

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

Set-Finder-Symbol

#!/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.

Alexander O'Mara
quelle