如何在终端中更改或设置文件或文件夹的图标,我是否需要使用脚本语言?
如何在终端中更改或设置文件或文件夹的图标,我是否需要使用脚本语言?
Answers:
您需要安装开发人员工具,然后以下可能会起作用。这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的回答和koiyu的回答很好地工作,但他们依靠公用事业(Rez
,DeRez
,和SetFile
)认为:
Rez
和DeRez
,因为它们与Carbon有关)osxiconutils看起来很有趣,但是将不再编译(从OSX 10.10.4开始)。
因此,我创建了CLIfileicon
,该CLI 应该可以在原始OSX机器上运行(没有前提条件);这是一个主要基于Bash的脚本xattr
,xxd
并且是一个有用的答案,它是一个嵌入式Python脚本,称为Cocoa 。
它允许设置/删除/提取文件或文件夹的自定义图标,包括在macOS 10.13(High Sierra)上的APFS卷上。
您可以按以下方式安装它:
[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
不再有效了)-我已经更新了答案以使内容更清楚。
我几乎为此悬赏,因为我没有使用@ mankoff的answer来更改文件夹的图标。但是我找到了解决方案。
要更改文件夹的图标,您无需指向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
预先安装在Mac OS中的Python已具有PyObjC,因此您无需安装任何软件包。
签出setfileicon
(源代码),这是由Damien Bobillot创建的实用程序。
在此处下载二进制文件:http : //maxao.free.fr/telechargements/setfileicon.gz
解压缩文件后,使其可执行:
chmod +x setfileicon
然后,您可以按以下方式使用它:
./setfileicon "my-icon.icns" "my-file-or-directory"
我有一个github项目,其中我从[shell / bash,python,perl,ruby等]脚本中创建AppleScript“小滴”,这些脚本将文件路径作为参数。我写了这个bash函数来更改文件夹的图标(因为AppleScript捆绑包是带有.app扩展名的Folders)。
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-file的临时资源文件:
$ 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)'
您可以从http://macruby.org下载MacRuby的安装程序。
奇怪的是,最好的解决方案似乎不是使用苹果自己的工具,而是使用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
错误。
它还需要安装开发人员工具。就像user588的答案一样,这将图形Icon.png
引入并应用于:file.ext
# 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
就像使用PyObjC的Python解决方案一样,事实证明它可以仅使用AppleScript来完成(与Python和其他脚本语言不同,在10.15 Catalina中不推荐使用)。
我在这里找到了如何在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不容易阅读,但是显然可以通过AppKit框架访问Objective-C代码来实现。