Как я могу изменить значок файла или папки с помощью терминала
-
16-10-2019 - |
Вопрос
Как я могу изменить или установить значок для файла или папки, в терминале мне нужно использовать язык сценариев?
Решение
Вам понадобятся установленные инструменты разработчика, и тогда следующие могут работать. Это берет графику в 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.
Другие советы
Благодаря нескольким годам задним числом:
Ответ пользователя588 а также Ответ Койю работать хорошо, но они полагаются на коммунальные услуги (Rez
, DeRez
, а также SetFile
) что:
- не установлены по умолчанию (они поставляются с XCODE или командными утилитами разработчика)
- теперь устарели (
Rez
а такжеDeRez
, потому что они относятся к углероду)
OsxicInutils выглядеть интересно, но больше не компилируется (с OSX 10.10.4).
Поэтому я создал Кли fileicon
, который должен работать на нетронутой машине OSX (без предварительных условий); это сценарий, основанный в первую очередь на xattr
, xxd
и встроенный сценарий Python, который называет какао, любезно предоставлена этот полезный ответ.
Это позволяет Настройка/удаление/извлечение пользовательских значков для/из файлов или папок, в том числе на объемах APFS на MacOS 10.13 (высокая сьерра).
Вы можете установить его следующим образом:
- Если у вас установлен node.js, из реестра NPM, с
[sudo] npm install -g fileicon
- В противном случае:
- Скачать CLI в качестве
fileicon
(Эта ссылка будет оставаться актуальной). - Сделать это исполняемым
chmod +x fileicon
. - Переместите его или символизируйте папку в своей
$PATH
, такие как/usr/local/bin
(требуетsudo
).
- Скачать CLI в качестве
Вот информация об использовании; Для получения полной информации обратитесь к руководство:
$ 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
я почти начал награду по этому поводу, потому что мне не удалось изменить значок папка с использованием @МанкоффS. отвечать. Анкет Но я нашел решение.
Чтобы изменить значок папки, вы не указываете Rez -append tmp.rsrc
к папке, но особенной Значок r
Файл внутри папки. Если вы не установили пользовательский значок в папку раньше, файл, вероятно, не будет, но Rez
Создает это на - фляжка. Удаление Icon\r
Файл удалит пользовательский значок, поэтому для предотвращения несчастных случаев хорошо быть скрытым.
Это модификации ответа Манкоффа:
# 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'
В дополнение к Руби, вот версия 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/telechargements/setfileicon.gz
После распаковки файла, сделайте его исполняемым:
chmod +x setfileicon
Тогда вы можете использовать его следующим образом:
./setfileicon "my-icon.icns" "my-file-or-directory"
у меня есть GitHub Project где я создаю 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'
то, что я делаю, потому что имя файла значка заканчивается буквальный возврат каретки \r
. Анкет Смотрите сами с:
find my-applescript.app -maxdepth 1 | less -U
Предполагая, что у нас уже есть ICNS-файл. Создайте файл Temp Resource, который указывает на 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 .
Скрыть файл значка Magic в текущей папке (нажмите ⇧⌘. Чтобы показать/скрыть скрытые файлы в Finder):
$ SetFile -a V Icon$'\r'
Дополнительные детали
Данные значков сохраняются как значение расширенного атрибута «com.apple.resourcefork» (команда терминала «xattr -p com.apple.resourcefork fileename.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 Command $ sips -i ImageFile.icns/png/jpg
генерирует ошибку "-Аддикон больше не поддерживается". Switch "-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, потому что оно имеет различные преимущества, которые не ограничены:
- Выходное разрешение файла
(Он работает до 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
В недавней версии MacOS (10.14), sips -i icon.png
получит --addIcon is no longer supported
ошибка.
Он также нуждался в инструментах разработчика. Это берет графику в Icon.png
и применяет это к file.ext
, как Ответ пользователя588:
# 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