Odpowiedzi:
Musisz zainstalować Narzędzia programistyczne, a następnie mogą działać następujące. To bierze grafikę icon.png
i stosuje ją 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
pracą z .avi
plikami. ### Rez - Fatal error trying to open the resource file "Video.avi" for writing.
„jakieś pomysły?
$PATH
(kody pośredniczące, w /usr/bin
których wiedzą, gdzie znaleźć rzeczywiste narzędzia), a nie /Developer/Tools
już, więc powinieneś je wywoływać tylko według ich nazw plików; tzn. w rozpatrywanym przypadku jako sprawiedliwy Rez
i DeRez
.
Z kilkuletnim doświadczeniem z perspektywy czasu:
Odpowiedź user588 za i odpowiedź koiyu za dobrze, ale opierają się one na media ( Rez
, DeRez
, i SetFile
), że:
Rez
i DeRez
ponieważ dotyczą węgla)osxiconutils wyglądają interesująco, ale nie będą się już kompilować (od OSX 10.10.4) .
Dlatego stworzyłem CLIfileicon
, który powinien działać na nieskazitelnym komputerze OSX (bez wymagań wstępnych) ; Jest to skrypt Bash głównie w oparciu xattr
, xxd
a wbudowany skrypt Pythona, który nazywa kakao, dzięki uprzejmości tym pomocne odpowiedzi .
Pozwala ustawić / usunąć / wyodrębnić niestandardowe ikony dla / z plików lub folderów , w tym na woluminach APFS w systemie macOS 10.13 (High Sierra).
Możesz zainstalować go w następujący sposób:
[sudo] npm install -g fileicon
fileicon
(ten link pozostanie aktualny).chmod +x fileicon
.$PATH
, takiego jak /usr/local/bin
(wymaga sudo
).Oto informacje o użyciu; pełne informacje można znaleźć w instrukcji :
$ 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
, które wciąż działa (i faktycznie zostało utworzone, ponieważ osxiconutils
już nie działa) - zaktualizowałem odpowiedź, aby była bardziej przejrzysta .
I prawie zaczął bounty na ten temat, bo nie udało się zmienić ikonę w folderze przy użyciu @ mankoff „s odpowiedź . Ale znalazłem rozwiązanie.
Aby zmienić ikonę folderu, nie wskazujesz Rez -append tmp.rsrc
folderu, ale specjalny Icon\r
plik w folderze. Jeśli wcześniej nie ustawiłeś niestandardowej ikony w folderze, plik prawdopodobnie nie będzie istniał, ale Rez
zostanie utworzony „w locie”. Usunięcie Icon\r
pliku spowoduje usunięcie niestandardowej ikony, więc aby zapobiec wypadkom, dobrze jest je ukryć.
Oto modyfikacje odpowiedzi mankoffa:
# 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'
Oprócz Ruby, oto wersja Python:
#!/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 wstępnie zainstalowany w systemie Mac OS ma już PyObjC, więc nie musisz instalować żadnych pakietów.
Sprawdź setfileicon
(kod źródłowy) , narzędzie stworzone przez Damiena Bobillota.
Pobierz plik binarny tutaj: http://maxao.free.fr/telechargements/setfileicon.gz
Po rozpakowaniu pliku, wykonaj go:
chmod +x setfileicon
Następnie możesz użyć go w następujący sposób:
./setfileicon "my-icon.icns" "my-file-or-directory"
Mam projekt github, w którym tworzę „kropelki” AppleScript ze skryptów [shell / bash, python, perl, ruby itp.], Które przyjmują ścieżki plików jako argumenty. Napisałem tę funkcję bash do zmiany ikony folderu (ponieważ pakiety AppleScript są folderami z rozszerzeniem .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'
}
Po zdefiniowaniu wywołujesz funkcję z 2 argumentami:
replace_icon /path/to/AppleScript.app /path/to/icon.png
lub
replace_icon /path/to/AppleScript.app http://i.imgur.com/LmUvWqB.png
Jak widać, drugim argumentem może być obraz w systemie lub adres URL.
UWAGA: To szalone $'/Icon\r'
, co robię, to dlatego, że nazwa pliku ikony kończy się dosłownym znakiem powrotu karetki \r
. Przekonaj się dzięki:
find my-applescript.app -maxdepth 1 | less -U
Zakładając, że mamy już plik icns. Utwórz plik zasobów tymczasowych, który wskazuje plik icns:
$ echo "read 'icns' (-16455) \"Icon.icns\";" >> Icon.rsrc
Dołącz plik zasobów jako wartość rozszerzonego atrybutu „com.apple.ResourceFork” do pliku:
$ Rez -a Icon.rsrc -o FileName.ext
Pokaż ikonę pliku:
$ SetFile -a C FileName.ext
Dołącz plik zasobów jako wartość rozszerzonego atrybutu „com.apple.ResourceFork” do pliku ikony magii w bieżącym folderze:
$ Rez -a Icon.rsrc -o Icon$'\r'
Pokaż ikonę bieżącego folderu:
$ SetFile -a C .
Ukryj plik magicznej ikony w bieżącym folderze (naciśnij ⇧⌘., Aby pokazać / ukryć ukryte pliki w Finderze):
$ SetFile -a V Icon$'\r'
Dane ikony są przechowywane jako wartość rozszerzonego atrybutu „com.apple.ResourceFork” (polecenie terminalu „xattr -p com.apple.ResourceFork nazwa_pliku.ext” wyświetla wartość). Dla folderu znajduje się magiczny (pusty i ukryty) plik Icon$'\r'
wewnątrz folderu. Aby wyodrębnić dane ikony z rozszerzonego atrybutu „com.apple.ResourceFork” do zwykłego pliku tekstowego (z którego wiemy poprawny identyfikator typu icns „-16455”):
$ DeRez -only icns FileWithIcon.ext > Icon.rsrc
$ DeRez -only icns /Folder/With/Icon/Icon$'\r' > Icon.rsrc
W systemie macOS 10.13 polecenie High Sierra $ sips -i ImageFile.icns/png/jpg
generuje błąd „--addIcon nie jest już obsługiwany”. Przełączenie „-i” oznacza „--addIcon” jako atrybut rozszerzony „com.apple.ResourceFork” na sam plik przy użyciu zawartości tego pliku obrazu.
Inną opcją jest użycie MacRuby:
/usr/local/bin/macruby -e 'framework "Cocoa";NSWorkspace.sharedWorkspace.setIcon(NSImage.alloc.initWithContentsOfFile("/tmp/a.png"),forFile:"/tmp/file",options:0)'
Możesz pobrać instalator dla MacRuby ze strony http://macruby.org .
O dziwo, najlepszym rozwiązaniem wydaje się nie używanie własnych narzędzi Apple, ale kodu Python, ponieważ ma on różne zalety, które nie są ograniczone przez:
Aktualizacja
Teraz (na macOS Sierra) odpowiedź @ koiyu wydaje się działać, więc możesz użyć tego dwuliniowego, aby skopiować ikonę z folderu źródłowego do folderu docelowego:
#!/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
W najnowszej wersji systemu macOS (10.14) sips -i icon.png
pojawi się --addIcon is no longer supported
błąd.
Wymagało to również zainstalowania Narzędzi programisty. To pobiera grafikę Icon.png
i stosuje ją file.ext
, podobnie jak odpowiedź 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
Okazuje się, że podobnie jak rozwiązanie Python wykorzystujące PyObjC, można to zrobić za pomocą samego AppleScript (który nie jest przestarzały w Catalina 10.15, w przeciwieństwie do Pythona i innych języków skryptowych).
Tutaj znalazłem przykład tego, jak to zrobić w GitHub:
#!/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 nie jest łatwy do odczytania, ale najwyraźniej można uzyskać dostęp do kodu Objective-C, aby to zrobić za pośrednictwem frameworku AppKit.