Bagaimana saya bisa mengubah atau mengatur ikon untuk file atau folder, di terminal, apakah saya perlu menggunakan bahasa skrip?
Bagaimana saya bisa mengubah atau mengatur ikon untuk file atau folder, di terminal, apakah saya perlu menggunakan bahasa skrip?
Jawaban:
Anda perlu Alat Pengembang diinstal, dan kemudian berikut ini mungkin berfungsi. Ini mengambil grafik icon.png
dan 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.
Rez -append
saat bekerja dengan .avi
file. ### Rez - Fatal error trying to open the resource file "Video.avi" for writing.
`ada ide?
$PATH
(bertopik di /usr/bin
yang tahu di mana menemukan alat yang sebenarnya), dan tidak di /Developer/Tools
lagi, jadi Anda harus memanggil mereka hanya dengan nama file mereka; yaitu, dalam kasus ini, sebagai adil Rez
dan DeRez
.
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:
Rez
dan 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
, xxd
dan 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:
[sudo] npm install -g fileicon
fileicon
(tautan ini akan tetap terkini).chmod +x fileicon
.$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
fileicon --man
).
curl -L http://git.io/n-install | bash
.
fileicon
, yang masih berfungsi (dan, pada kenyataannya, telah dibuat, karena osxiconutils
tidak lagi berfungsi) - Saya telah memperbarui jawaban untuk membuatnya lebih jelas .
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.rsrc
ke folder tetapi Icon\r
file khusus di dalam folder. Jika Anda belum menetapkan ikon khusus ke folder sebelumnya, file tersebut mungkin tidak akan ada, tetapi Rez
membuatnya secara langsung. Menghapus Icon\r
file 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'
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.
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"
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
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'
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/jpg
menghasilkan 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.
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 .
Anehnya, solusi terbaik tampaknya bukan menggunakan alat milik Apple tetapi kode Python karena memiliki berbagai kelebihan yang tidak dibatasi oleh:
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
Dalam versi macOS terbaru (10.14), sips -i icon.png
akan mendapatkan --addIcon is no longer supported
kesalahan.
Itu juga perlu Alat Pengembang diinstal. Ini menggunakan grafik dalam Icon.png
dan 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
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:
#!/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.