Wie kann ich das Symbol für eine Datei oder einen Ordner im Terminal ändern oder festlegen, muss ich eine Skriptsprache verwenden?
Sie müssen die Developer Tools installiert haben, und dann könnte Folgendes funktionieren. Dies nimmt die Grafik auf icon.png
und 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.
Rez -append
beim Arbeiten mit .avi
Dateien. ### Rez - Fatal error trying to open the resource file "Video.avi" for writing.
` Irgendwelche Ideen?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).$PATH
(Stubs in /usr/bin
, die wissen, wo die eigentlichen Tools zu finden sind) und nicht /Developer/Tools
mehr im Verzeichnis befinden, also sollten Sie sie nur über ihre Dateinamen aufrufen; dh im vorliegenden Fall als gerade Rez
und DeRez
.Mit dem Vorteil mehrerer Jahre Rückblick:
Die Antwort von user588 und koiyus funktionieren gut, aber sie verlassen sich auf Dienstprogramme ( Rez
, DeRez
und SetFile
), die:
Rez
und 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
, xxd
und 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:
fileicon
(dieser Link bleibt aktuell).chmod +x fileicon
.
$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
fileicon --man
).curl -L http://git.io/n-install | bash
.fileicon
geht, das immer noch funktioniert (und tatsächlich erstellt wurde, weil osxiconutils
es nicht mehr funktioniert) - ich habe die Antwort aktualisiert, um das klarer zu machen .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.rsrc
auf den Ordner, sondern auf eine spezielle Icon\r
Datei innerhalb des Ordners. Wenn Sie zuvor noch kein benutzerdefiniertes Symbol für den Ordner festgelegt haben, wird die Datei wahrscheinlich nicht existieren, aber Rez
sie wird im laufenden Betrieb erstellt. Durch das Löschen der Icon\r
Datei 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'
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.
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"
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'
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/jpg
erzeugt 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.
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 .
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:
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
Ä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:
#!/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.
In der aktuellen macOS-Version (10.14) sips -i icon.png
wird ein --addIcon is no longer supported
Fehler angezeigt.
Außerdem müssen die Entwicklertools installiert sein. Dies verwendet die Grafik in Icon.png
und 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
Error: Unable to write image to file /Users/uname/tmpicns.icns.4rzX6
den ersten Befehl. Ich versuche es sogar mit sudo
, funktioniert nichtsips -z x x input.png -o output.png
wobei 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.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.
touch
den Ordner für den Finder erneut rendern.
Benutzer588
kolen