Як я можу змінити значок файлу чи папки за допомогою терміналу


53

Як я можу змінити або встановити піктограму для файлу чи папки в терміналі, чи потрібно використовувати мову сценарію?


Дивіться також sveinbjorn.org/osxiconutils

Зауважте, що він не масштабується добре. Намагався застосовувати піктограми до багатьох каталогів в одній директорії - Finder працював дуже повільно.
колен

Відповіді:


31

Вам знадобиться встановити Інструменти для розробників, і тоді може працювати наступне. Це бере зображення icon.pngта застосовує його до 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.

Дивовижно, це саме те, що я хотів.
ocodo

У мене виникають проблеми Rez -appendпри роботі з .aviфайлами. ### Rez - Fatal error trying to open the resource file "Video.avi" for writing.`якісь ідеї?
окудо

Цікаво, що файл також не зміг прийняти нову іконку методом Get Info copy / paste.
ocodo

чи є обмеження щодо розміру значка? Якщо я використовую великий jpg (1024x768), його було б змінено на щось дійсно невелике. Чи можу я якось зберегти свій початковий розмір?
nuc

2
Зауважте, що в останніх версіях OSX інструменти для розробників знаходяться в $PATH(заглушки, /usr/binякі знають, де знайти фактичні інструменти), а не /Developer/Toolsбільше, тому вам слід посилатися на них лише за своїми іменами; тобто у випадку, що є, як справедливий Rezі DeRez.
mklement0

19

З користю кілька років заднього огляду:

Відповідь user588 в і відповідь коію в добре працювати, але вони покладаються на комунальні послуги ( Rez, DeRezі SetFile) , що:

  • не встановлені за замовчуванням (вони поставляються або з Xcode, або з утилітами командного рядка розробника)
  • тепер застарілі ( Rezі DeRez, оскільки вони стосуються Карбону)

osxiconutils виглядають цікаво, але більше не збиратимуться (на OSX 10.10.4) .


Тому я створив CLIfileicon , який повинен працювати на незайманій машині OSX (без передумов) ; це сценарій Bash, заснований, головним чином xattr, xxdі вбудований сценарій Python, який викликає какао, люб’язно надавши цю корисну відповідь .

Це дозволяє встановлювати / видаляти / витягувати власні піктограми для / з файлів чи папок , у тому числі на томах APFS на macOS 10.13 (High Sierra).

Ви можете встановити його наступним чином:

  • Якщо у вас встановлено Node.js, з реєстру npm , с
    [sudo] npm install -g fileicon
  • Інакше:
    • Завантажте CLI як fileicon(це посилання залишатиметься актуальним).
    • Зробіть його виконуваним за допомогою chmod +x fileicon.
    • Перемістіть або позначте посилання на папку у вашій папці $PATH, наприклад /usr/local/bin(вимагає sudo).

Ось інформація про використання; для повної інформації див. посібник :

$ 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: [У відповідь на коментар із видаленим часом] я розумію, що не всі мають або хочуть встановити Node.js, тому також є пряме посилання для завантаження (див. Пункт "В іншому випадку" у моїй відповіді) - це автономний скрипт Bash (єдине, що ви відмовилися, встановивши цей спосіб, - це встановлення сторінки man, але ви можете отримати просто-текстове візуалізацію сторінки керівництва за допомогою fileicon --man).
mklement0

@Slomojo: [У відповідь на давно видалений коментар] Щодо того, чому пропонується установка через npm: я виявила, що екосистема npm загалом є моїм улюбленим менеджером пакетів, і я опублікував ряд кросплатформних сценаріїв CLI-бази, що базуються там, не пов'язані з Node.js. Я також створити одну команду, на рівні користувача установки для НПМ (через п і Node.js) , що робить його простим у використанні НПМ навіть для людей , які в іншому випадку не мають ніякого інтересу до Node.js: curl -L http://git.io/n-install | bash.
mklement0

3
Це приємне нестандартне робоче рішення. +1
користувач3439894

1
@PatNiemeyer: Дякую, я оновив посилання на osxiconutils, але зауважте, що ця відповідь стосується корисностіfileicon , яка все ще працює (і, власне, створена, бо osxiconutilsбільше не працює) - я оновив відповідь, щоб зробити це зрозумілішим .
mklement0

1
Я розумію, що я на кілька років відстаю від усіх інших у цій темі, але просто хотів зазначити, що я це відкрив сьогодні, і це чудово. Дякую, що ви зробили це! 👍
TJ

18

Я майже почав баунти на це, тому що мені не вдалося змінити іконку в папку з допомогою @ Манкоф «s відповідь . Але я знайшов рішення.


Щоб змінити значок папки, ви не вказуєте Rez -append tmp.rsrcна папку, а на спеціальний Icon\rфайл всередині папки. Якщо ви раніше не встановили власну піктограму в папку, файл, ймовірно, не буде існувати, але Rezстворює його в режимі льоту. Видалення Icon\rфайлу видалить спеціальний значок, тому для запобігання нещасних випадків добре його сховати.

Ось такі зміни у відповіді 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'

А для файлу? Зверніть увагу на мій коментар щодо: avi файлів
ocodo

@slomojo Вибачте, але я не можу повторити помилку, яку ви отримали - просто протестував рішення mankoff файлом .avi. Перевірте дозволи та файли, які ви ввели?
Ярі Кейненен

Я піду ще раз, можливо, я раніше помилився.
ocodo

Я відчайдушно намагаюся зробити це для USB-накопичувача. Усі команди "працюють" в тому, що вони не повертають помилок, але мені все одно залишається палець з незмінним значком. Будь-які думки, і я буду вічно вдячний!
сингмотор

8

Окрім Ruby, ось версія 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, попередньо встановлений у Mac OS, вже є PyObjC, тому вам не доведеться встановлювати жодні пакети.


Я додав декодування UTF-8 до unicode, інакше сценарій не працює з іменами, що не належать до ASCII. Також додана перевірка поверненої вартості, невстановлення значка призведе до повернення коду 1.
Колен

1
Чи все-таки ми можемо вказати, що значок не змінює співвідношення сторін? Це чудово, але файли зображень перетворюються на квадрат. Дякую!
Густаво Безерра

1
Не знайшли відповіді, але порівняння зображень із прозорими накладками перед рукою спрацювало чудово: stackoverflow.com/questions/12179342/…
Gustavo Bezerra

7

Ознайомтеся setfileicon(вихідний код) , утиліта, створена Даміеном Бобілло.

Завантажте двійковий файл тут: http://maxao.free.fr/telechargments/setfileicon.gz

Розпакувавши файл, зробіть його виконуваним:

chmod +x setfileicon

Потім ви можете використовувати його наступним чином:

./setfileicon "my-icon.icns" "my-file-or-directory"

Дякую за це, дуже корисно. До речі, я редагую метод GUI, щоб зменшити шум.
окудо

На жаль, більшість кодів зараз застаріло.
Муген

3

У мене є проект github, де я створюю "краплі" AppleScript із скриптів [shell / bash, python, perl, ruby ​​тощо ", які сприймають шляхи файлів як аргументи. Я написав цю функцію bash для зміни піктограми папки (адже пакети AppleScript - це папки з розширенням .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'
}

Визначившись, ви викликаєте функцію з двома аргументами:

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

або

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

Як ви бачите, другим аргументом може бути зображення у вашій системі або URL-адреса.

ПРИМІТКА. Ця божевільна $'/Icon\r'річ, яку я роблю, це тому, що назва файлу Icon закінчується буквальним поверненням каретки \r. Побачте самі:

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

3

Припустимо, що у нас вже є icns-файл. Створіть файл ресурсу temp, який вказує на icns-файл:

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

Додайте файл ресурсу як значення розширеного атрибута "com.apple.ResourceFork" у файл:

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

Покажіть піктограму файлу:

$ SetFile -a C FileName.ext

Додайте файл ресурсу як значення розширеного атрибута "com.apple.ResourceFork" до файлу магічного значка всередині поточної папки:

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

Показати піктограму поточної папки:

$ SetFile -a C .

Сховати файл магічного значка всередині поточної папки (натисніть ⇧⌘., Щоб показати / приховати приховані файли у Finder):

$ SetFile -a V Icon$'\r'

Додаткові деталі

Дані значків зберігаються як значення розширеного атрибута "com.apple.ResourceFork" (команда терміналу "xattr -p com.apple.ResourceFork FileName.ext" друкує значення). Для папки є магічний (який порожній і прихований) файл Icon$'\r'всередині папки. Щоб витягнути дані значків із розширеного атрибута "com.apple.ResourceFork" у файл простого текстового ресурсу (з якого ми знаємо правильний ідентифікатор типу icns "-16455"):

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

У macOS 10.13 команда High Sierra $ sips -i ImageFile.icns/png/jpgгенерує помилку "--addIcon більше не підтримується". Переключити "-i" означає "--addIcon" як розширений атрибут "com.apple.ResourceFork" на сам файл, використовуючи вміст цього файлу зображень.


# <stdin>: 1: ### /Applications/Xcode.app/Contents/Developer/usr/bin/Rez - SysError 0 під час читання.
кванта

2

Іншим варіантом є використання MacRuby:

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

Ви можете завантажити інсталятор для MacRuby з http://macruby.org .


1
Посилання - і MacRuby - очевидно, тепер мертві; MacRuby, очевидно, змінився комерційним підпискою RubyMotion .
mklement0

2

Як не дивно, найкращим рішенням є не використання власних інструментів Apple, а код Python, оскільки він має різні переваги, не обмежуючись:

  • Роздільна здатність вихідного файлу
    (працює до 1024x1024)
  • формат вхідного файлу
    (спробували з ICNS та PNG)
  • дозволи на встановлення
    (визначте це як функцію)

Оновлення

Тепер (на macOS Sierra) @ koiyu, здається, відповідь спрацьовує, тому ви можете скористатися цим дволанцюжком, щоб скопіювати піктограму з вихідної папки у вашу цільову папку:

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

Ласкаво просимо до "Запитайте різних" Здається, це було б краще, як коментар. Я знаю, що у вас ще немає необхідних балів, але я попросив когось, хто має сили, прийти подивитися. Крім того, я написав Applescript, який робить все це для вас акуратним пакетом, дивіться мою відповідь на подібне запитання в цьому SE.
JMY1000

Так, я намагався, але не міг цього зробити. Крім того, я думаю, що друга частина вашого коментаря була б кращою як відповідь, а не пов'язана з першою.
dardo82

2

В останній версії macOS (10.14) sips -i icon.pngз'явиться --addIcon is no longer supportedпомилка.

Також потрібні були встановлені Інструменти для розробників. Це бере зображення Icon.pngта застосовує його file.ext, як і відповідь 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

0

Так само, як і рішення Python, використовуючи PyObjC, виявляється, це можна зробити лише за допомогою AppleScript (який не застаріло в 10,15 Catalina, на відміну від Python та інших мов скриптів).

Я знайшов приклад того, як це зробити на GitHub тут:

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 непростий для читання, але, очевидно, можна отримати доступ до коду Objective-C, щоб це зробити через AppKit.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.