Як я можу змінити або встановити піктограму для файлу чи папки в терміналі, чи потрібно використовувати мову сценарію?
Як я можу змінити або встановити піктограму для файлу чи папки в терміналі, чи потрібно використовувати мову сценарію?
Відповіді:
Вам знадобиться встановити Інструменти для розробників, і тоді може працювати наступне. Це бере зображення 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.
Rez -append
при роботі з .avi
файлами. ### Rez - Fatal error trying to open the resource file "Video.avi" for writing.
`якісь ідеї?
$PATH
(заглушки, /usr/bin
які знають, де знайти фактичні інструменти), а не /Developer/Tools
більше, тому вам слід посилатися на них лише за своїми іменами; тобто у випадку, що є, як справедливий Rez
і DeRez
.
З користю кілька років заднього огляду:
Відповідь user588 в і відповідь коію в добре працювати, але вони покладаються на комунальні послуги ( Rez
, DeRez
і SetFile
) , що:
Rez
і DeRez
, оскільки вони стосуються Карбону)osxiconutils виглядають цікаво, але більше не збиратимуться (на OSX 10.10.4) .
Тому я створив CLIfileicon
, який повинен працювати на незайманій машині OSX (без передумов) ; це сценарій Bash, заснований, головним чином xattr
, xxd
і вбудований сценарій Python, який викликає какао, люб’язно надавши цю корисну відповідь .
Це дозволяє встановлювати / видаляти / витягувати власні піктограми для / з файлів чи папок , у тому числі на томах APFS на macOS 10.13 (High Sierra).
Ви можете встановити його наступним чином:
[sudo] npm install -g fileicon
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
fileicon --man
).
curl -L http://git.io/n-install | bash
.
fileicon
, яка все ще працює (і, власне, створена, бо osxiconutils
більше не працює) - я оновив відповідь, щоб зробити це зрозумілішим .
Я майже почав баунти на це, тому що мені не вдалося змінити іконку в папку з допомогою @ Манкоф «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'
Окрім 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, тому вам не доведеться встановлювати жодні пакети.
Ознайомтеся setfileicon
(вихідний код) , утиліта, створена Даміеном Бобілло.
Завантажте двійковий файл тут: http://maxao.free.fr/telechargments/setfileicon.gz
Розпакувавши файл, зробіть його виконуваним:
chmod +x setfileicon
Потім ви можете використовувати його наступним чином:
./setfileicon "my-icon.icns" "my-file-or-directory"
У мене є проект 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
Припустимо, що у нас вже є 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" на сам файл, використовуючи вміст цього файлу зображень.
Іншим варіантом є використання 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 .
Як не дивно, найкращим рішенням є не використання власних інструментів Apple, а код Python, оскільки він має різні переваги, не обмежуючись:
Оновлення
Тепер (на 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
В останній версії 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
Так само, як і рішення Python, використовуючи PyObjC, виявляється, це можна зробити лише за допомогою AppleScript (який не застаріло в 10,15 Catalina, на відміну від Python та інших мов скриптів).
Я знайшов приклад того, як це зробити на 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 непростий для читання, але, очевидно, можна отримати доступ до коду Objective-C, щоб це зробити через AppKit.