如何使用终端更改文件或文件夹图标


Answers:


31

您需要安装开发人员工具,然后以下可能会起作用。这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.

太棒了,这就是我想要的。
ocodo 2011年

Rez -append处理.avi文件时遇到问题。### Rez - Fatal error trying to open the resource file "Video.avi" for writing.有什么想法吗?
ocodo 2011年

有趣的是,这也使文件无法通过“获取信息”复制/粘贴方法接受新图标。
ocodo 2011年

图标大小有限制吗?如果使用大jpg(1024x768),它将被调整为非常小的尺寸。我可以以某种方式保留其原始尺寸吗?
nuc

2
请注意,在最新的OSX版本中,开发人员工具位于$PATH/usr/bin知道在哪里可以找到实际工具的存根中),而/Developer/Tools不再存在,因此,您应仅按其文件名调用它们。即,在眼前的情况下,如RezDeRez
mklement0

19

经过数年的事后回顾:

user588的回答koiyu的回答很好地工作,但他们依靠公用事业(RezDeRez,和SetFile)认为:

  • 默认情况下未安装(它们随Xcode或开发人员命令行实用程序一起提供)
  • 现在已弃用(RezDeRez,因为它们与Carbon有关)

osxiconutils看起来很有趣,但是将不再编译(从OSX 10.10.4开始)


因此,我创建了CLIfileicon,该CLI 应该可以在原始OSX机器上运行(没有前提条件);这是一个主要基于Bash的脚本xattrxxd并且是一个有用的答案,它是一个嵌入式Python脚本,称为Cocoa 。

它允许设置/删除/提取文件或文件夹的自定义图标,包括在macOS 10.13(High Sierra)上的APFS卷上。

您可以按以下方式安装它:

  • 如果您已安装Node.js,请从npm注册表中使用
    [sudo] npm install -g fileicon
  • 除此以外:
    • 将CLI下载为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

@Slomojo:[回应自删除的评论]我知道不是每个人都有或想要安装Node.js,这就是为什么直接下载链接也存在的原因(请参见答案中的“其他:”列表项) -这是一个自包含的Bash脚本(通过这种方式安装,您唯一不需要做的就是安装手册页,但是您可以使用来获得手册页的纯文本呈现fileicon --man)。
mklement0

@Slomojo:[回应自删除的评论]至于为什么提供通过npm安装的原因:我发现npm生态系统总体上是我最喜欢的软件包管理器,并且已经发布了许多跨平台的脚本与Node.js不相关的基于CLI的CLI。我还为npm创建了一个单命令用户级安装程序(通过n和Node.js),即使对于那些对Node.js不感兴趣的人也可以轻松使用npm curl -L http://git.io/n-install | bash
mklement0

3
这是一个很好的开箱即用的解决方案。+1
user3439894 '16

1
@PatNiemeyer:谢谢,我已经更新了osxiconutils链接,但是请注意,这个答案是关于Utility的fileicon,它仍然有效(并且实际上是创建的,因为osxiconutils不再有效了)-我已经更新了答案以使内容更清楚。
mklement0'3

1
我意识到我在这个主题上比其他人落后了几年,但是我想说一下我今天发现了这一点,这很棒。谢谢你的努力!👍
TJ骆马湖

18

几乎为此悬赏,因为我没有使用@ mankoffanswer来更改文件夹的图标。但是我找到了解决方案。


要更改文件夹的图标,您无需指向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'

和一个文件?请注意我的评论:avi文件
ocodo 2011年

@slomojo很抱歉,但是我无法复制您收到的错误-只是使用.avi文件测试了mankoff的解决方案。重新检查文件权限和您输入的命令?
贾里·凯纳嫩(JariKeinänen)2011年

我再说一遍,也许我以前犯了一个错误。
ocodo 2011年

我拼命试图为USB拇指驱动器执行此操作。所有命令“起作用”的地方在于它们不会返回错误,但是我仍然留下了拇指驱动器的图标未更改的信息。任何想法,我将永远感激不已!
singmotor 2015年

8

除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,因此您无需安装任何软件包。


我将utf-8的解码添加到unicode,否则该脚本不适用于非ASCII文件名。返回值还增加了检查,未设置图标将导致1返回码
kolen

1
无论如何,我们可以指定未修改宽高比的图标吗?效果很好,但是图像文件被重塑为正方形。谢谢!
古斯塔沃·贝扎拉

1
没有完全找到答案,但现蕾与透明边框的图像前手的工作只是罚款:stackoverflow.com/questions/12179342/...
古斯塔沃·贝泽拉

7

签出setfileicon(源代码),这是由Damien Bobillot创建的实用程序。

在此处下载二进制文件:http : //maxao.free.fr/telechargements/setfileicon.gz

解压缩文件后,使其可执行:

chmod +x setfileicon

然后,您可以按以下方式使用它:

./setfileicon "my-icon.icns" "my-file-or-directory"

谢谢,确实非常有帮助。顺便说一句,我正在编辑GUI方法,以减少噪音。
ocodo 2012年

不幸的是,现在大多数代码已被弃用。
Mugen

3

我有一个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

3

假设我们已经有了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”添加到此文件本身。


#<stdin>:1:### /Applications/Xcode.app/Contents/Developer/usr/bin/Rez-读取期间发生SysError 0。
量子

2

另一个选择是使用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的安装程序。


1
链接-和MacRuby-现在已经死了;MacRuby显然是由基于订阅的商业化RubyMotion所取代
mklement0

2

奇怪的是,最好的解决方案似乎不是使用苹果自己的工具,而是使用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

欢迎询问不同!似乎将其作为注释会更好。我知道您还没有要求的要点,但是我已经请有能力的人来看看。另外,我编写了一个Applescript,它以整洁的方式为您完成所有这些工作,请参阅我对此SE中类似问题的回答。
JMY1000 '16

是的,我尝试过但无法做到。此外,我认为您的意见的第二部分将是更好的答案,与第一部分无关。
dardo82 '16

2

在最新的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

0

就像使用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代码来实现。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.