ฉันจะเปลี่ยนไฟล์หรือไอคอนโฟลเดอร์โดยใช้ Terminal ได้อย่างไร


53

ฉันจะเปลี่ยนหรือตั้งค่าไอคอนสำหรับไฟล์หรือโฟลเดอร์ในเทอร์มินัลฉันต้องใช้ภาษาสคริปต์ได้อย่างไร


ดูเพิ่มเติมที่sveinbjorn.org/osxiconutils

โปรดทราบว่ามันไม่ได้ปรับขนาดได้ดี พยายามใช้ไอคอนกับไดเรกทอรีจำนวนมากในไดเรกทอรีเดียว - Finder ทำงานช้ามาก
kolen

คำตอบ:


31

คุณจะต้องมีเครื่องมือสำหรับนักพัฒนาติดตั้งแล้วสิ่งต่อไปนี้อาจใช้ได้ นี้จะใช้เวลาในกราฟิกและนำไปใช้icon.pngfile.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

ฉันมีปัญหาRez -appendเมื่อทำงานกับ.aviไฟล์ ### Rez - Fatal error trying to open the resource file "Video.avi" for writing.`ความคิดใด ๆ
ocodo

ที่น่าสนใจคือมันทำให้ไฟล์ไม่สามารถยอมรับไอคอนใหม่ผ่านวิธีการคัดลอก / วางข้อมูล
ocodo

มีการ จำกัด ขนาดไอคอนหรือไม่ ถ้าฉันใช้ jpg ขนาดใหญ่ (1024x768) มันจะถูกปรับขนาดให้เล็กลงจริงๆ .. ฉันจะสามารถรักษาขนาดดั้งเดิมไว้ได้ไหม?
nuc

2
โปรดทราบว่าใน OSX เวอร์ชันล่าสุดเครื่องมือสำหรับนักพัฒนาอยู่ใน$PATH(ไม่/usr/binทราบว่าจะหาเครื่องมือที่แท้จริงได้ที่ไหน) และไม่ได้อยู่ใน/Developer/Toolsอีกต่อไปดังนั้นคุณควรเรียกใช้ไฟล์เหล่านั้นด้วยชื่อไฟล์ของพวกเขา เช่นในกรณีที่มือเป็นเพียงและRez DeRez
mklement0

19

ด้วยข้อดีของการเข้าใจถึงปัญหาย้อนหลังหลายปี:

คำตอบ user588 ของและคำตอบของ koiyuทำงานได้ดี แต่พวกเขาพึ่งพาสาธารณูปโภค ( Rez, DeRezและSetFile) ที่:

  • ไม่ได้ติดตั้งตามค่าเริ่มต้น (มาพร้อมกับ Xcode หรือยูทิลิตี้บรรทัดคำสั่งสำหรับนักพัฒนา)
  • เลิกใช้แล้ว ( RezและDeRezเนื่องจากเกี่ยวข้องกับ Carbon)

osxiconutilsดูน่าสนใจ แต่จะไม่รวบรวมใด ๆ อีกต่อไป ( ณ OSX 10.10.4)


ดังนั้นฉันได้สร้างCLIfileiconซึ่งควรทำงานกับเครื่อง OSX ที่เก่าแก่ (ไม่มีข้อกำหนดเบื้องต้น) ; มันเป็นสคริปต์ Bash โดยพื้นฐานxattrแล้วxxdและสคริปต์ Python แบบฝังที่เรียก Cocoa ซึ่งเป็นคำตอบที่มีประโยชน์นี้

จะช่วยให้การตั้งค่า / ลบ / แยกไอคอนที่กำหนดเองสำหรับ / จากไฟล์หรือโฟลเดอร์รวมถึงในปริมาณ APFS บน macOS 10.13 (High Sierra)

คุณสามารถติดตั้งได้ดังนี้:

  • หากคุณติดตั้ง 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 ที่มีอยู่ในตัวเอง (สิ่งเดียวที่คุณลืมโดยการติดตั้งด้วยวิธีนี้คือการติดตั้ง man page แต่คุณสามารถรับการเรนเดอร์ข้อความธรรมดาของหน้าคู่มือด้วยfileicon --man)
mklement0

@Slomojo: [เพื่อตอบสนองต่อความคิดเห็นที่ถูกลบตั้งแต่] สำหรับเหตุผลที่นำเสนอการติดตั้งผ่านทาง npm: ฉันพบระบบนิเวศ npm ที่จะเป็นผู้จัดการแพคเกจที่ชื่นชอบโดยรวมและฉันได้เผยแพร่ข้ามแพลตฟอร์มสคริปต์จำนวนหนึ่ง ตาม CLIs นั่นไม่ใช่ Node.js ที่เกี่ยวข้อง ฉันยังสร้างเดียวคำสั่งติดตั้งระดับผู้ใช้สำหรับ NPM (ผ่าน n และ Node.js)ที่ทำให้มันง่ายต่อการใช้ NPM แม้สำหรับผู้ที่มิฉะนั้นมีความสนใจใน 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 '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'

และสำหรับไฟล์? หมายเหตุความคิดเห็นของฉันอีกครั้ง: ไฟล์ avi
ocodo

@slomojo ขออภัย แต่ฉันไม่สามารถทำซ้ำข้อผิดพลาดที่คุณได้รับ - เพียงทดสอบวิธีการแก้ปัญหาของ mankoff ด้วยไฟล์. avi ตรวจสอบการอนุญาตของไฟล์และคำสั่งที่คุณป้อนอีกครั้ง?
Jari Keinänen

ฉันจะให้มันไปอีกบางทีฉันอาจทำผิดพลาดมาก่อน
ocodo

ฉันพยายามอย่างยิ่งที่จะทำเช่นนี้สำหรับธัมบ์ไดรฟ์ 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

Python ที่ติดตั้งล่วงหน้าใน Mac OS มี PyObjC อยู่แล้วดังนั้นคุณไม่ต้องติดตั้งแพ็คเกจใด ๆ


ฉันเพิ่มการถอดรหัส UTF-8 เป็น Unicode มิฉะนั้นสคริปต์จะไม่ทำงานกับชื่อไฟล์ที่ไม่ใช่ ASCII นอกจากนี้ยังเพิ่มการตรวจสอบค่าตอบแทนความล้มเหลวในการตั้งค่าไอคอนจะส่งผลให้โค้ดส่งคืนมีค่า 1
kolen

1
มีอยู่แล้วเราสามารถระบุไอคอนที่ไม่มีการแก้ไขอัตราส่วนกว้างยาวได้หรือไม่? มันใช้งานได้ดี แต่ไฟล์รูปภาพถูกเปลี่ยนเป็นสี่เหลี่ยม ขอบคุณ!
Gustavo Bezerra

1
ไม่พบคำตอบที่แน่ชัด แต่การยกภาพด้วยการใส่แผ่นใสก่อนที่มือจะทำงานได้ดี: stackoverflow.com/questions/12179342//
Gustavo Bezerra

7

ตรวจสอบsetfileicon(ซอร์สโค้ด)ยูทิลิตี้ที่สร้างโดย Damien Bobillot

ดาวน์โหลดไบนารีที่นี่: http://maxao.free.fr/telechargements/setfileicon.gz

หลังจากคลายไฟล์แล้วให้เรียกใช้งานได้:

chmod +x setfileicon

จากนั้นคุณสามารถใช้มันได้ดังต่อไปนี้:

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

ขอบคุณสำหรับสิ่งนั้นมีประโยชน์มากจริงๆ BTW ฉันกำลังแก้ไขวิธี GUI เพื่อลดเสียงรบกวน
ocodo

น่าเสียดายที่ตอนนี้โค้ดส่วนใหญ่เลิกใช้แล้ว
Mugen

3

ฉันมีโครงการ 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

3

สมมติว่าเรามีไฟล์ 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" ไปยังไฟล์นี้โดยใช้เนื้อหาของไฟล์ภาพนี้


# <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 ดูเหมือนว่าคำตอบจะทำงานได้ดังนั้นคุณสามารถใช้สองซับเพื่อคัดลอกไอคอนจากโฟลเดอร์ต้นทางไปยังโฟลเดอร์ปลายทางของคุณ:

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

ใช่ฉันพยายาม แต่ไม่สามารถทำได้ นอกจากนี้ฉันคิดว่าส่วนที่ 2 ของความคิดเห็นของคุณจะดีกว่าเป็นคำตอบไม่เกี่ยวข้องกับส่วนที่ 1
dardo82

2

ในรุ่น 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

0

เหมือนกับโซลูชัน 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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.