Bagaimana saya bisa mengubah ikon file atau folder menggunakan Terminal

54

Bagaimana saya bisa mengubah atau mengatur ikon untuk file atau folder, di terminal, apakah saya perlu menggunakan bahasa skrip?

ocodo
sumber
Perhatikan bahwa itu tidak skala dengan baik. Mencoba menerapkan ikon ke banyak direktori dalam satu direktori - Finder bekerja sangat lambat.
kolen

Jawaban:

32

Anda perlu Alat Pengembang diinstal, dan kemudian berikut ini mungkin berfungsi. Ini mengambil grafik icon.pngdan menerapkannya 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.

sumber
Luar biasa, itulah yang saya inginkan.
ocodo
Saya mengalami masalah Rez -appendsaat bekerja dengan .avifile. ### Rez - Fatal error trying to open the resource file "Video.avi" for writing.`ada ide?
ocodo
Menariknya, itu juga membuat file tidak dapat menerima ikon baru melalui metode Dapatkan info salin / tempel.
ocodo
apakah ada batasan ukuran ikon? Jika saya menggunakan jpg besar (1024x768) itu akan diubah ukurannya menjadi sesuatu yang sangat kecil .. Bisakah saya mempertahankan ukuran aslinya?
nuc
3
Perhatikan bahwa dalam versi OSX terbaru alat pengembang berada di $PATH(bertopik di /usr/binyang tahu di mana menemukan alat yang sebenarnya), dan tidak di /Developer/Toolslagi, jadi Anda harus memanggil mereka hanya dengan nama file mereka; yaitu, dalam kasus ini, sebagai adil Rezdan DeRez.
mklement0
19

Dengan manfaat beberapa tahun ke belakang:

Jawaban user588 ini dan jawaban koiyu ini bekerja dengan baik, tetapi mereka bergantung pada utilitas ( Rez, DeRez, dan SetFile) bahwa:

  • tidak diinstal secara default (mereka datang dengan Xcode atau utilitas baris perintah pengembang)
  • sekarang usang ( Rezdan DeRez, karena mereka berhubungan dengan Carbon)

osxiconutils terlihat menarik, tetapi tidak dapat dikompilasi lagi (pada OSX 10.10.4) .


Oleh karena itu saya telah membuat CLIfileicon , yang seharusnya bekerja pada mesin OSX yang asli (tidak ada prasyarat) ; ini adalah skrip Bash yang didasarkan terutama pada xattr, xxddan skrip Python tersemat yang menyebut Cocoa, berdasarkan jawaban yang bermanfaat ini .

Ini memungkinkan pengaturan / menghapus / mengekstraksi ikon khusus untuk / dari file atau folder , termasuk pada volume APFS pada macOS 10.13 (High Sierra).

Anda dapat menginstalnya sebagai berikut:

  • Jika Anda telah menginstal Node.js, dari registri npm , dengan
    [sudo] npm install -g fileicon
  • Jika tidak:
    • Unduh CLI sebagai fileicon(tautan ini akan tetap terkini).
    • Jadikan itu dapat dieksekusi dengan chmod +x fileicon.
    • Pindahkan atau symlink ke folder di folder Anda $PATH, seperti /usr/local/bin(memerlukan sudo).

Inilah informasi penggunaannya; untuk informasi lengkap, lihat manual :

$ 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
mklement0
sumber
@Slomojo: [Menanggapi komentar yang dihapus sejak] Saya mengerti bahwa tidak semua orang memiliki atau ingin menginstal Node.js, itu sebabnya tautan unduhan langsung juga ada di sana (lihat daftar item 'Jika tidak: `dalam jawaban saya) - ini adalah skrip Bash mandiri (satu-satunya hal yang Anda lupakan dengan menginstal cara ini adalah pemasangan halaman manual, tetapi Anda bisa mendapatkan rendering teks biasa dari halaman manual dengan fileicon --man).
mklement0
@Slomojo: [Menanggapi komentar yang dihapus sejak saat itu] Mengenai mengapa menginstal melalui npm ditawarkan: Saya telah menemukan ekosistem npm menjadi manajer paket favorit saya secara keseluruhan, dan saya telah menerbitkan sejumlah cross-platform, skrip CLI berbasis di sana yang tidak terkait Node.js. Saya juga membuat -perintah tunggal, installer user-level untuk NPM (melalui n dan Node.js) yang membuatnya mudah digunakan NPM bahkan untuk orang yang dinyatakan tidak tertarik pada Node.js: curl -L http://git.io/n-install | bash.
mklement0
3
Ini adalah solusi yang bagus untuk bekerja. +1
user3439894
1
@PatNiemeyer: Terima kasih, saya telah memperbarui tautan osxiconutils, tetapi perhatikan bahwa jawaban ini tentang utilitasfileicon , yang masih berfungsi (dan, pada kenyataannya, telah dibuat, karena osxiconutilstidak lagi berfungsi) - Saya telah memperbarui jawaban untuk membuatnya lebih jelas .
mklement0
1
Saya menyadari bahwa saya beberapa tahun di belakang semua orang di utas ini, tetapi hanya ingin menyebutkan bahwa saya menemukan ini hari ini dan itu hebat. Terima kasih telah membuatnya! 👍
TJ Luoma
18

Aku hampir mulai karunia ini, karena saya tidak berhasil mengubah ikon dari folder menggunakan @ Mankoff 's jawaban . Tetapi saya menemukan solusinya.


Untuk mengubah ikon folder Anda tidak menunjuk Rez -append tmp.rsrcke folder tetapi Icon\rfile khusus di dalam folder. Jika Anda belum menetapkan ikon khusus ke folder sebelumnya, file tersebut mungkin tidak akan ada, tetapi Rezmembuatnya secara langsung. Menghapus Icon\rfile akan menghapus ikon khusus, jadi untuk mencegah kecelakaan sebaiknya disembunyikan.

Ini adalah modifikasi dari jawaban 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'
Jari Keinänen
sumber
Dan untuk sebuah file? Catat komentar saya re: avi files
ocodo
@slomojo maaf, tapi saya tidak bisa meniru kesalahan yang Anda dapatkan — baru saja menguji solusi mankoff dengan file .avi. Periksa kembali izin file dan perintah yang Anda masukkan?
Jari Keinänen
Saya akan mencoba lagi, mungkin saya membuat kesalahan sebelumnya.
ocodo
Saya mati-matian berusaha melakukan ini untuk USB thumb drive. Semua perintah "berfungsi" karena tidak mengembalikan kesalahan, tetapi saya masih menggunakan thumb drive dengan ikon yang tidak berubah. Pikiran dan saya akan berterima kasih selamanya!
singmotor
8

Selain Ruby, ini adalah versi 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 yang telah diinstal sebelumnya di Mac OS sudah memiliki PyObjC sehingga Anda tidak perlu menginstal paket apa pun.

kolen
sumber
Saya menambahkan decoding UTF-8 ke unicode, kalau tidak skrip tidak bekerja dengan nama file non-ASCII. Juga ditambahkan cek nilai pengembalian, kegagalan untuk menetapkan ikon akan menghasilkan kode kembali 1.
kolen
1
Adakah di sana kita dapat menentukan ikon yang tidak memiliki rasio aspek yang dimodifikasi? Ini berfungsi dengan baik, tetapi file gambar bisa dibentuk ulang menjadi persegi. Terima kasih!
Gustavo Bezerra
1
Tidak menemukan jawaban, tetapi mengkuadratkan gambar dengan lapisan transparan sebelum tangan bekerja dengan baik: stackoverflow.com/questions/12179342/...
Gustavo Bezerra
7

Lihat setfileicon(kode sumber) , sebuah utilitas yang dibuat oleh Damien Bobillot.

Unduh biner di sini: http://maxao.free.fr/telechargements/setfileicon.gz

Setelah membongkar file, membuatnya dapat dieksekusi:

chmod +x setfileicon

Maka Anda dapat menggunakannya sebagai berikut:

./setfileicon "my-icon.icns" "my-file-or-directory"
Mathias Bynens
sumber
Terima kasih untuk itu, memang sangat membantu. BTW, saya mengedit metode GUI, untuk mengurangi kebisingan.
ocodo
Sayangnya sebagian besar kode sekarang sudah tidak digunakan lagi.
Mugen
3

Saya memiliki proyek github di mana saya membuat AppleScript "tetesan" dari skrip [shell / bash, python, perl, ruby, dll] yang mengambil jalur file sebagai argumen. Saya menulis fungsi bash ini untuk mengubah ikon folder (karena bundel AppleScript adalah Folder dengan ekstensi .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'
}

Setelah ditentukan, Anda memanggil fungsi dengan 2 argumen:

replace_icon /path/to/AppleScript.app /path/to/icon.png

atau

replace_icon /path/to/AppleScript.app http://i.imgur.com/LmUvWqB.png

Seperti yang Anda lihat, argumen kedua dapat berupa gambar di sistem Anda, atau URL.

CATATAN: Hal yang tampak gila $'/Icon\r'yang saya lakukan adalah karena nama file Ikon berakhir dengan carriage return literal\r . Lihat sendiri:

find my-applescript.app -maxdepth 1 | less -U
Bruno Bronosky
sumber
3

Dengan asumsi bahwa kita sudah memiliki file icns. Buat file sumber daya temp yang menunjuk ke file icns:

$ echo "read 'icns' (-16455) \"Icon.icns\";" >> Icon.rsrc

Tambahkan file sumber daya sebagai nilai atribut extended "com.apple.ResourceFork" ke file:

$ Rez -a Icon.rsrc -o FileName.ext

Tampilkan ikon file:

$ SetFile -a C FileName.ext

Tambahkan file sumber daya sebagai nilai atribut extended "com.apple.ResourceFork" ke file ikon ajaib di dalam folder saat ini:

$ Rez -a Icon.rsrc -o Icon$'\r'

Tampilkan ikon folder saat ini:

$ SetFile -a C .

Sembunyikan file ikon ajaib di dalam folder saat ini (tekan ⇧⌘. Untuk menampilkan / menyembunyikan file tersembunyi di Finder):

$ SetFile -a V Icon$'\r'

Detil tambahan

Data ikon disimpan sebagai nilai atribut diperluas "com.apple.ResourceFork" (perintah Terminal "xattr -p com.apple.ResourceFork FileName.ext" mencetak nilai). Untuk folder ada file ajaib (yang kosong dan tersembunyi) Icon$'\r'di dalam folder. Untuk mengekstrak data ikon dari atribut diperluas "com.apple.ResourceFork" ke dalam file sumber daya teks biasa (dari mana kami tahu benar pengidentifikasi tipe icns "-16455"):

$ DeRez -only icns FileWithIcon.ext > Icon.rsrc
$ DeRez -only icns /Folder/With/Icon/Icon$'\r' > Icon.rsrc

Di bawah macOS 10.13, perintah Sierra Tinggi $ sips -i ImageFile.icns/png/jpgmenghasilkan kesalahan "--addIcon tidak lagi didukung". Beralih "-i" berarti "--addIcon" sebagai atribut yang diperluas "com.apple.ResourceFork" ke file ini sendiri menggunakan konten file gambar ini.

Sergii Kryzhanovskyi
sumber
# <stdin>: 1: ### /Applications/Xcode.app/Contents/Developer/usr/bin/Rez - SysError 0 saat membaca.
kuanta
2

Opsi lain adalah menggunakan MacRuby:

/usr/local/bin/macruby -e 'framework "Cocoa";NSWorkspace.sharedWorkspace.setIcon(NSImage.alloc.initWithContentsOfFile("/tmp/a.png"),forFile:"/tmp/file",options:0)'

Anda dapat mengunduh pemasang untuk MacRuby dari http://macruby.org .

Lri
sumber
1
Tautan - dan MacRuby - tampaknya sudah mati; MacRuby tampaknya digantikan oleh RubyMotion komersial, berbasis langganan .
mklement0
2

Anehnya, solusi terbaik tampaknya bukan menggunakan alat milik Apple tetapi kode Python karena memiliki berbagai kelebihan yang tidak dibatasi oleh:

  • resolusi file output
    (berfungsi hingga 1024x1024)
  • format file input
    (dicoba dengan ICNS dan PNG)
  • izin untuk menginstal
    (mendefinisikannya sebagai fungsi)

Memperbarui

Jawaban Now (di macOS Sierra) @ koiyu sepertinya berfungsi, jadi Anda bisa menggunakan dua-baris ini untuk menyalin ikon dari folder sumber ke folder tujuan Anda:

#!/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
dardo82
sumber
Selamat Datang di Tanya Berbeda! Sepertinya ini akan lebih baik sebagai komentar. Saya tahu Anda belum memiliki poin yang dibutuhkan, tetapi saya telah meminta seseorang yang memiliki kekuatan untuk datang melihatnya. Selain itu, saya telah menulis sebuah Applescript yang melakukan semua ini untuk Anda dalam bundel yang rapi, lihat jawaban saya untuk pertanyaan serupa di SE ini.
JMY1000
Ya, saya mencoba tetapi tidak bisa melakukannya. Lebih jauh lagi saya berpikir bahwa bagian ke-2 dari komentar Anda akan lebih baik sebagai jawaban, tidak terkait dengan yang pertama.
dardo82
2

Dalam versi macOS terbaru (10.14), sips -i icon.pngakan mendapatkan --addIcon is no longer supportedkesalahan.

Itu juga perlu Alat Pengembang diinstal. Ini menggunakan grafik dalam Icon.pngdan menerapkannya file.ext, seperti jawaban user588 :

# Covert Icon.png to tmpicons.icns:
sips -s format icns Icon.png --out tmpicns.icns

# Create temporary resource file which points to tmpicons.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 tmpicons.icns && rm tmpicns.rsrc
FradSer
sumber
0

Sama seperti solusi Python menggunakan PyObjC, ternyata itu dapat dilakukan hanya dengan AppleScript (yang tidak ditinggalkan di 10.15 Catalina, tidak seperti Python dan bahasa scripting lainnya).

Saya menemukan contoh bagaimana melakukan ini di GitHub di sini:

set-finder-icon

#!/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 tidak mudah dibaca, tetapi tampaknya mungkin untuk mengakses kode Objective-C untuk melakukan ini melalui kerangka kerja AppKit.

Alexander O'Mara
sumber