Как я могу изменить или установить значок для файла или папки в терминале, мне нужно использовать язык сценариев?
Как я могу изменить или установить значок для файла или папки в терминале, мне нужно использовать язык сценариев?
Ответы:
Вам понадобятся инструменты разработчика, и тогда может сработать следующее. Это берет изображение 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, поэтому вам не нужно устанавливать какие-либо пакеты.
Check setfileicon
(исходный код) , утилита, созданная Damien Bobillot.
Загрузите двоичный файл здесь: http://maxao.free.fr/telechargements/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'
}
После определения вы вызываете функцию с 2 аргументами:
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-файл. Создайте временный файл ресурсов, который указывает на 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 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
Как и решение 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.