如何在OS X上使用CLI设置文件或目录的图标?

9

在Finder中使用“获取信息”对话框设置文件或目录上的图标非常简单。

  1. 从预览等应用程序中复制图像
  2. 打开文件或目录上的“获取信息”
  3. 按TAB键选择图标
  4. 粘贴Cmd-V

但是如何使用命令行完成此操作呢?


如果你要回答自己的问题,你应该将答案部分移到答案部分并标记为已接受。否则,其他人会试图为你回答它。 - Ned Deily
2个回答

11

这里有一个名为 "setIcon.sh" 的bash脚本可以用来实现

#!/bin/sh
# Sets an icon on file or directory
# Usage setIcon.sh iconimage.jpg /path/to/[file|folder]
iconSource=$1
iconDestination=$2
icon=/tmp/`basename $iconSource`
rsrc=/tmp/icon.rsrc

# Create icon from the iconSource
cp $iconSource $icon

# Add icon to image file, meaning use itself as the icon
sips -i $icon

# Take that icon and put it into a rsrc file
DeRez -only icns $icon > $rsrc

# Apply the rsrc file to
SetFile -a C $iconDestination

if [ -f $iconDestination ]; then
    # Destination is a file
    Rez -append $rsrc -o $iconDestination
elif [ -d $iconDestination ]; then
    # Destination is a directory
    # Create the magical Icon\r file
    touch $iconDestination/$'Icon\r'
    Rez -append $rsrc -o $iconDestination/Icon?
    SetFile -a V $iconDestination/Icon?
fi

# Sometimes Finder needs to be reactivated
#osascript -e 'tell application "Finder" to quit'
#osascript -e 'delay 2'
#osascript -e 'tell application "Finder" to activate'

rm $rsrc $icon 

刚在MLion上尝试了一下,创建“../https-::www.pivotaltracker.com:dashboard.webloc”时出现了### Rez - SysError -37错误。 尝试打开资源文件“../https-::www.pivotaltracker.com:dashboard.webloc”进行写入时出现### Rez - 致命错误。 - ort11
谢谢您。当我的iconSource是.icns文件时,您的脚本也对我有用。 - bryan kennedy
2
Rez和SetFile在它们的手册页面中被标记为已弃用。有没有一种非废弃的方法来完成这个操作? - Johannes Bittner
1
我还没有找到一种非废弃的方法来做这件事。但是值得一提的是,Rez和SetFile仍然存在于2022年的macOS 12.3中。我现在会继续使用这种方法。 - magicus
在 macOS 13.0 上仍然可以正常工作。 - ijoseph
今天我追逐了一段时间,试图从shell脚本中让神奇的Icon\r文件正常工作。当我意识到在这种情况下通常用于指定文件名的符号实际上是ANSI-C Quoting时,灯泡终于亮了。但是,在脚本和命令行中,它们的工作方式不同。例如,在脚本中,您不能使用Icon$'\r'。您必须将其指定为$'Icon\r'。无论如何,任何引用或转义都无法使bash/zsh满意。 - MushyMiddle

2
假设我们已经有了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 is no longer supported。开关-i表示将"com.apple.ResourceFork"扩展属性作为"--addIcon"附加到该文件本身上,使用此图像文件的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接