ターミナルを使用してファイルまたはフォルダーのアイコンを変更するにはどうすればよいですか


53

ターミナルでファイルまたはフォルダーのアイコンを変更または設定するには、スクリプト言語を使用する必要がありますか?



うまくスケールしないことに注意してください。1つのディレクトリ内の多数のディレクトリにアイコンを適用しようとしました— Finderの動作が非常に遅くなりました。
コーレン

回答:


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.

素晴らしい、それはちょうど私が欲しかったものです。
オコド

ファイルRez -append.avi操作するときに問題が発生します。### Rez - Fatal error trying to open the resource file "Video.avi" for writing.`アイデアはありますか?
オコド

おもしろいことに、ファイルの[情報を取得]のコピー/貼り付けメソッドを使用して新しいアイコンを受け入れることができなくなりました。
オコド

アイコンのサイズに制限はありますか?大きなjpg(1024x768)を使用すると、本当に小さなサイズに変更されます。元のサイズをどうにか保持できますか?
-nuc

2
最近のOSXバージョンでは、開発者ツールは$PATH/usr/bin実際のツールを見つける場所を知っているスタブ)にあり、/Developer/Toolsもう存在しないことに注意してください。すなわち、当面のケースでは、RezとのようにDeRez
mklement0

19

数年後知恵の恩恵を受けて:

user588の答えkoiyuの答えの仕事だけでなく、彼らは(ユーティリティに依存しているRezDeRezSetFile)その:

  • デフォルトではインストールされません(Xcodeまたは開発者のコ​​マンドラインユーティリティが付属しています)
  • 廃止されました(RezおよびDeRez、Carbonに関連しているため)

osxiconutilsはおもしろそうに見えますが、もうコンパイルされません(OSX 10.10.4時点)


したがって、私はCLIfileiconを作成しました。これは、初期のOSXマシンで動作するはずです(前提条件はありません)。それは主に基づいて、bashスクリプトでxattrxxdそしてココアの礼儀呼び出し、埋め込まれたPythonスクリプトこの便利な答えを

macOS 10.13(High Sierra)上のAPFSボリュームを含む、ファイルまたはフォルダーのカスタムアイコンの設定/削除/抽出が可能です

次のようにインストールできます。

  • Node.jsがインストールされている場合、npmレジストリから、
    [sudo] npm install -g fileicon
  • そうでなければ:
    • CLIをダウンロードしますfileicon(このリンクは最新のままです)。
    • で実行可能にしchmod +x fileiconます。
    • (必須)$PATHなどののフォルダーに移動またはシンボリックリンクします。/usr/local/binsudo

使用情報は次のとおりです。詳細については、マニュアルを参照してください。

$ 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を誰もが持っているわけでもインストールしたいわけでもないので、直接ダウンロードリンクもあります(回答の 'Otherwise: `リスト項目を参照) -それは自己完結型のBashスクリプトです(この方法でインストールすることで忘れるのは、manページのインストールだけですが、マニュアルページのプレーンテキストレンダリングはで取得できますfileicon --man)。
mklement0

@Slomojo:[その後削除されたコメントへの応答] npmを介したインストールが提供される理由について:npmエコシステムが全体として私のお気に入りのパッケージマネージャーであることがわかり、クロスプラットフォームのスクリプトを多数公開しましたNode.jsに関連しないベースのCLI。また、Node.jsに関心がない人でも簡単にnpmを使用できるようにする、npm用の単一コマンドのユーザーレベルインストーラー(nおよびNode.jsを使用を作成しましたcurl -L http://git.io/n-install | bash
mklement0

3
これは、すぐに使用できる優れたソリューションです。+1
user3439894

1
@PatNiemeyer:ありがとう、osxiconutilsリンクを更新しましたが、この答えはfileiconまだ機能しているユーティリティに関するものであることに注意してください(実際にはosxiconutils機能しなくなったので作成されました)-私はそれを明確にするために答えを更新しました。
mklement0

1
私はこのスレッドで他のすべての人よりも数年遅れていることを認識していますが、今日これを発見したことを言及したかっただけで、素晴らしいことです。作ってくれてありがとう!👍
TJ Luoma

18

私はほとんど私がのアイコンに変更するために管理していなかったので、この上の恩恵を開始したフォルダ使用を@ mankoff答えを。しかし、私は解決策を見つけました。


フォルダーのアイコンを変更Rez -append tmp.rsrcするには、フォルダーではなくIcon\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'

そして、ファイルのために?私のコメントに注意してください:aviファイル
オコド

@slomojo申し訳ありませんが、エラーを再現することはできません。.aviファイルでmankoffのソリューションをテストしてください。入力したファイルのアクセス許可とコマンドを再確認しますか?
ヤリケイネン

私はそれをもう一度やります、おそらく私は前に間違いを犯しました。
オコド

USBサムドライブでこれを実行しようと必死です。すべてのコマンドはエラーを返さないという点で「機能します」が、アイコンが変更されていないサムドライブが残っています。考えと私は永遠に感謝します!
singmotor

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が返されます。
kolen14年

1
とにかく、アスペクト比が変更されていないアイコンを指定できますか?うまく機能しますが、画像ファイルは正方形に変形されます。ありがとう!
グスタボベゼラ

1
正確に答えを見つけるしなかったが、手がうまく働いていた前に、透明のパディングで画像を二乗:stackoverflow.com/questions/12179342/...
グスタボBezerraを

7

Damien Bobillotによって作成されたユーティリティsetfileicon(ソースコード)をチェックアウトします。

ここからバイナリをダウンロードします:http : //maxao.free.fr/telechargements/setfileicon.gz

ファイルを解凍したら、実行可能にします。

chmod +x setfileicon

その後、次のように使用できます。

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

本当にありがとうございます。ところで、私はノイズを減らすために、GUIメソッドを編集しています。
オコド

残念ながら、現在ほとんどのコードは廃止されています。
ムゲン

3

引数としてファイルパスを取る[shell / bash、python、perl、rubyなど]スクリプトからAppleScriptの「ドロップレット」を作成するgithubプロジェクトがあります。フォルダのアイコンを変更するためにこの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

ご覧のとおり、2番目の引数はシステム上の画像、またはURLです。

注:その狂気探して$'/Icon\r'、私がやる事はあるので、とアイコンファイルの端の名前リテラルキャリッジリターン\r。で自分の目で確かめてください:

find my-applescript.app -maxdepth 1 | less -U

3

icns-fileがすでにあると仮定します。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"は、このイメージファイルのコンテンツを使用してこのファイル自体に拡張属性 "com.apple.ResourceFork"としての "--addIcon"を意味します。


#<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)'

MacRubyのインストーラーはhttp://macruby.orgからダウンロードできます。


1
リンク-およびMacRuby-は明らかに死んでいる。MacRubyは、サブスクリプションベースの商用RubyMotionによって明らかに成功しました。
mklement0

2

奇妙なことに、最善の解決策は、Apple独自のツールではなくPythonコードを使用することです。

  • 出力ファイルの解像度
    (1024x1024まで機能します)
  • 入力ファイル形式
    (ICNSおよびPNGで試行)
  • インストールする権限
    (関数として定義)

更新

これで(macOS Sierraで)@koiyuの答えは機能しているように見えるので、この2ライナーを使用して、ソースフォルダーから目的のフォルダーにアイコンをコピーできます。

#!/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

Ask Differentへようこそ!これは、コメントとしては良いと思われます。あなたはまだ必要なポイントを持っていないことを知っていますが、私は来る力を持っている人を見てみました。さらに、私はあなたのためにきちんとしたバンドルでこれらすべてを行うApplescriptを書きました。このSEの同様の質問に対する私の答えを
JMY1000

はい、試しましたが、できませんでした。さらに、あなたのコメントの2番目の部分は、1番目のコメントとは関係なく、答えとしてより良いと思います。
dardo82

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コードにアクセスしてこれを行うことが可能です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.