Jak mogę zmienić ikonę pliku lub folderu za pomocą terminala

53

Jak mogę zmienić lub ustawić ikonę pliku lub folderu, czy w terminalu muszę używać języka skryptowego?

ocodo
źródło
Pamiętaj, że nie skaluje się dobrze. Próbowałem zastosować ikony do wielu katalogów w jednym katalogu - Finder działał bardzo wolno.
kolen

Odpowiedzi:

31

Musisz zainstalować Narzędzia programistyczne, a następnie mogą działać następujące. To bierze grafikę icon.pngi 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.

źródło
Świetnie, właśnie tego chciałem.
ocodo
Mam problem z Rez -appendpracą z .aviplikami. ### Rez - Fatal error trying to open the resource file "Video.avi" for writing.„jakieś pomysły?
ocodo
Co ciekawe, plik nie mógł zaakceptować nowej ikony za pomocą metody kopiowania / wklejania informacji Get Info.
ocodo
czy istnieje ograniczenie rozmiaru ikony? Jeśli użyję dużego pliku jpg (1024 x 768), jego rozmiar zostanie zmieniony na coś naprawdę małego. Czy mogę jakoś zachować oryginalny rozmiar?
nuc
2
Zauważ, że w najnowszych wersjach OSX narzędzia programistyczne znajdują się w $PATH(kody pośredniczące, w /usr/binktórych wiedzą, gdzie znaleźć rzeczywiste narzędzia), a nie /Developer/Toolsjuż, więc powinieneś je wywoływać tylko według ich nazw plików; tzn. w rozpatrywanym przypadku jako sprawiedliwy Rezi DeRez.
mklement0
19

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:

  • nie są instalowane domyślnie (pochodzą z Xcode lub narzędzi wiersza poleceń programisty)
  • są teraz przestarzałe ( Rezi DeRezponieważ 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, xxda 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:

  • Jeśli masz zainstalowany Node.js, z rejestru npm , przy pomocy
    [sudo] npm install -g fileicon
  • Inaczej:
    • Pobierz CLI jako fileicon(ten link pozostanie aktualny).
    • Zrób to za pomocą chmod +x fileicon.
    • Przenieś go lub dowiązaj symbolicznie do folderu w swoim $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
mklement0
źródło
@Slomojo: [W odpowiedzi na odtąd usunięty komentarz] Rozumiem, że nie wszyscy mają lub chcą zainstalować Node.js, dlatego też istnieje bezpośredni link do pobrania (patrz pozycja „W przeciwnym razie:” w mojej odpowiedzi) - jest to samodzielny skrypt Bash (jedyną rzeczą, której rezygnujesz z instalacji w ten sposób, jest instalacja strony man, ale możesz uzyskać renderowanie zwykłego tekstu strony podręcznika za pomocą fileicon --man).
mklement0
@Slomojo: [W odpowiedzi na odtąd usunięty komentarz] Jeśli chodzi o to, dlaczego oferowana jest instalacja przez npm: Znalazłem ekosystem npm jako mój ulubiony menedżer pakietów i opublikowałem wiele skryptów międzyplatformowych oparte na CLI, które nie są związane z Node.js. Ja również stworzenie jednego polecenia, użytkownik poziomu instalatora dla KMP (przez n i node.js) sprawia, że jest łatwy w użyciu KMP nawet dla ludzi, którzy w przeciwnym razie nie mają żadnego interesu w node.js: curl -L http://git.io/n-install | bash.
mklement0
3
To miłe, gotowe rozwiązanie. +1
użytkownik3439894
1
@PatNiemeyer: Dzięki, zaktualizowałem link osxiconutils, ale zauważ, że ta odpowiedź dotyczy narzędziafileicon , które wciąż działa (i faktycznie zostało utworzone, ponieważ osxiconutilsjuż nie działa) - zaktualizowałem odpowiedź, aby była bardziej przejrzysta .
mklement0
1
Zdaję sobie sprawę, że jestem kilka lat za wszystkimi innymi w tym wątku, ale chciałem tylko wspomnieć, że odkryłem to dzisiaj i jest świetnie. Dziękujemy za zrobienie tego! 👍
TJ Luoma,
18

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.rsrcfolderu, ale specjalny Icon\rplik w folderze. Jeśli wcześniej nie ustawiłeś niestandardowej ikony w folderze, plik prawdopodobnie nie będzie istniał, ale Rezzostanie utworzony „w locie”. Usunięcie Icon\rpliku 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'
Jari Keinänen
źródło
A dla pliku? Zanotuj mój komentarz dotyczący: plików avi
ocodo
@slomojo przepraszam, ale nie mogę powtórzyć otrzymanego błędu - po prostu przetestowałem rozwiązanie mankoffa za pomocą pliku .avi. Sprawdź ponownie uprawnienia do plików i wprowadzone polecenia?
Jari Keinänen,
Spróbuję jeszcze raz, być może wcześniej popełniłem błąd.
ocodo
Desperacko próbuję to zrobić dla napędu USB. Wszystkie polecenia „działają” w tym sensie, że nie zwracają błędów, ale wciąż pozostaje mi pamięć USB z niezmienioną ikoną. Wszelkie myśli i będę wiecznie wdzięczny!
singmotor
8

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.

kolen
źródło
Dodałem dekodowanie UTF-8 do Unicode, w przeciwnym razie skrypt nie działałby z nazwami plików innymi niż ASCII. Dodano również kontrolę wartości zwracanej, brak ustawienia ikony spowoduje kod powrotu 1.
kolen
1
Czy w każdym razie możemy określić, że ikona nie ma zmodyfikowanego współczynnika kształtu? Działa świetnie, ale pliki obrazów są przekształcane w kwadrat. Dzięki!
Gustavo Bezerra
1
Nie znalazłem dokładnej odpowiedzi, ale poprawienie obrazu za pomocą przezroczystej podkładki przed ręką działało dobrze: stackoverflow.com/questions/12179342/...
Gustavo Bezerra
7

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"
Mathias Bynens
źródło
Dzięki za to, naprawdę bardzo pomocne. BTW, edytuję metodę GUI, aby zredukować hałas.
ocodo
Niestety większość kodu jest już przestarzała.
Mugen,
3

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
Bruno Bronosky
źródło
3

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'

Dodatkowe Szczegóły

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/jpggeneruje 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.

Sergii Kryzhanovskyi
źródło
# <stdin>: 1: ### /Applications/Xcode.app/Contents/Developer/usr/bin/Rez - SysError 0 podczas odczytu.
kwanty
2

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 .

Lri
źródło
1
Link - i MacRuby - najwyraźniej są teraz martwe; MacRuby najwyraźniej zastąpił komercyjny, oparty na subskrypcji RubyMotion .
mklement0
2

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:

  • rozdzielczość pliku wyjściowego
    (działa do 1024x1024)
  • format pliku wejściowego
    (wypróbowany z ICNS i PNG)
  • uprawnienia do instalacji
    (zdefiniuj jako funkcję)

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
dardo82
źródło
Witamy w Zapytaj inaczej! Wydaje się, że byłoby lepiej jako komentarz. Wiem, że nie masz jeszcze wymaganych punktów, ale poprosiłem kogoś, kto ma moc, by przyjść. Ponadto napisałem Applescript, który robi to wszystko dla Ciebie w zgrabnym pakiecie, zobacz moją odpowiedź na podobne pytanie na tej SE.
JMY1000,
Tak, próbowałem, ale nie mogłem tego zrobić. Ponadto uważam, że druga część twojego komentarza byłaby lepsza jako odpowiedź, nie będąc powiązana z pierwszą.
dardo82
2

W najnowszej wersji systemu macOS (10.14) sips -i icon.pngpojawi się --addIcon is no longer supportedbłąd.

Wymagało to również zainstalowania Narzędzi programisty. To pobiera grafikę Icon.pngi 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
FradSer
źródło
0

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:

ikona set-finder

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

Alexander O'Mara
źródło