ฉันจะเปลี่ยนหรือตั้งค่าไอคอนสำหรับไฟล์หรือโฟลเดอร์ในเทอร์มินัลฉันต้องใช้ภาษาสคริปต์ได้อย่างไร
ฉันจะเปลี่ยนหรือตั้งค่าไอคอนสำหรับไฟล์หรือโฟลเดอร์ในเทอร์มินัลฉันต้องใช้ภาษาสคริปต์ได้อย่างไร
คำตอบ:
คุณจะต้องมีเครื่องมือสำหรับนักพัฒนาติดตั้งแล้วสิ่งต่อไปนี้อาจใช้ได้ นี้จะใช้เวลาในกราฟิกและนำไปใช้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.
`ความคิดใด ๆ
$PATH
(ไม่/usr/bin
ทราบว่าจะหาเครื่องมือที่แท้จริงได้ที่ไหน) และไม่ได้อยู่ใน/Developer/Tools
อีกต่อไปดังนั้นคุณควรเรียกใช้ไฟล์เหล่านั้นด้วยชื่อไฟล์ของพวกเขา เช่นในกรณีที่มือเป็นเพียงและRez
DeRez
ด้วยข้อดีของการเข้าใจถึงปัญหาย้อนหลังหลายปี:
คำตอบ user588 ของและคำตอบของ koiyuทำงานได้ดี แต่พวกเขาพึ่งพาสาธารณูปโภค ( Rez
, DeRez
และSetFile
) ที่:
Rez
และDeRez
เนื่องจากเกี่ยวข้องกับ Carbon)osxiconutilsดูน่าสนใจ แต่จะไม่รวบรวมใด ๆ อีกต่อไป ( ณ OSX 10.10.4)
ดังนั้นฉันได้สร้างCLIfileicon
ซึ่งควรทำงานกับเครื่อง OSX ที่เก่าแก่ (ไม่มีข้อกำหนดเบื้องต้น) ; มันเป็นสคริปต์ Bash โดยพื้นฐานxattr
แล้วxxd
และสคริปต์ Python แบบฝังที่เรียก Cocoa ซึ่งเป็นคำตอบที่มีประโยชน์นี้
จะช่วยให้การตั้งค่า / ลบ / แยกไอคอนที่กำหนดเองสำหรับ / จากไฟล์หรือโฟลเดอร์รวมถึงในปริมาณ APFS บน macOS 10.13 (High Sierra)
คุณสามารถติดตั้งได้ดังนี้:
[sudo] npm install -g fileicon
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
fileicon --man
)
curl -L http://git.io/n-install | bash
ไม่มี:
fileicon
ที่ยังใช้งานได้ (และอันที่จริงแล้วถูกสร้างขึ้นเพราะosxiconutils
ใช้งานไม่ได้อีกต่อไป) - ฉันได้อัปเดตคำตอบแล้ว .
ฉันเกือบจะเริ่มรางวัลเกี่ยวกับเรื่องนี้เพราะผมไม่ได้จัดการเปลี่ยนไอคอนของที่โฟลเดอร์โดยใช้ @ Mankoff 's คำตอบ แต่ฉันพบวิธีแก้ปัญหา
ในการเปลี่ยนไอคอนของโฟลเดอร์คุณไม่ได้ชี้Rez -append tmp.rsrc
ไปที่โฟลเดอร์ แต่เป็นIcon\r
ไฟล์พิเศษในโฟลเดอร์ หากคุณยังไม่ได้ตั้งค่าไอคอนที่กำหนดเองไปยังโฟลเดอร์ก่อนหน้าไฟล์นั้นอาจจะไม่มีอยู่ แต่Rez
จะสร้างแบบ on – the – fly การลบ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'
นอกจาก 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
Python ที่ติดตั้งล่วงหน้าใน Mac OS มี PyObjC อยู่แล้วดังนั้นคุณไม่ต้องติดตั้งแพ็คเกจใด ๆ
ตรวจสอบsetfileicon
(ซอร์สโค้ด)ยูทิลิตี้ที่สร้างโดย Damien Bobillot
ดาวน์โหลดไบนารีที่นี่: http://maxao.free.fr/telechargements/setfileicon.gz
หลังจากคลายไฟล์แล้วให้เรียกใช้งานได้:
chmod +x setfileicon
จากนั้นคุณสามารถใช้มันได้ดังต่อไปนี้:
./setfileicon "my-icon.icns" "my-file-or-directory"
ฉันมีโครงการ githubที่ฉันสร้าง AppleScript "หยด" จากสคริปต์ [shell / bash, python, perl, ruby ฯลฯ ] ที่ใช้พา ธ ของไฟล์เป็นอาร์กิวเมนต์ ฉันเขียนฟังก์ชันทุบตีนี้เพื่อเปลี่ยนไอคอนของโฟลเดอร์ (เนื่องจากชุดรวม 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
ในขณะที่คุณสามารถดูอาร์กิวเมนต์ที่สองสามารถเป็นภาพในระบบของคุณหรือ URL
หมายเหตุ:ที่มองบ้า$'/Icon\r'
สิ่งที่ผมทำคือเนื่องจากชื่อของไฟล์ไอคอนที่ลงท้ายด้วยตัวอักษร\r
กลับรถ ดูตัวเองด้วย:
find my-applescript.app -maxdepth 1 | less -U
สมมติว่าเรามีไฟล์ icns อยู่แล้ว สร้างไฟล์ทรัพยากร temp ซึ่งชี้ไปที่ 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" ไปยังไฟล์นี้โดยใช้เนื้อหาของไฟล์ภาพนี้
ตัวเลือกอื่นคือใช้ 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
วิธีแก้ปัญหาที่ดีที่สุดที่น่าประหลาดใจก็น่าจะไม่ใช้เครื่องมือของ Apple แต่เป็นรหัส Python เนื่องจากมีข้อดีหลายประการที่ไม่ได้ถูก จำกัด โดย:
ปรับปรุง
ตอนนี้ (บน 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
ในรุ่น macOS ล่าสุด (10.14) sips -i icon.png
จะได้รับ--addIcon is no longer supported
ข้อผิดพลาด
นอกจากนี้ยังจำเป็นต้องติดตั้งเครื่องมือสำหรับนักพัฒนา สิ่งนี้จะนำกราฟิกเข้ามาIcon.png
และนำไปใช้file.ext
เช่นเดียวกับคำตอบของ user588 :
# 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
เหมือนกับโซลูชัน Python ที่ใช้ PyObjC ปรากฎว่าสามารถทำได้ด้วย AppleScript เท่านั้น (ซึ่งไม่ได้คัดค้านใน 10.15 Catalina ซึ่งแตกต่างจาก Python และภาษาสคริปต์อื่น ๆ )
ฉันพบตัวอย่างของวิธีการทำสิ่งนี้ใน 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 ไม่ใช่เรื่องง่ายในการอ่าน แต่เห็นได้ชัดว่าเป็นไปได้ในการเข้าถึงรหัส Objective-C เพื่อทำสิ่งนี้ผ่านเฟรมเวิร์ก AppKit