Làm cách nào để thay đổi hoặc đặt biểu tượng cho một tệp hoặc thư mục, trong thiết bị đầu cuối, tôi có cần sử dụng ngôn ngữ kịch bản không?
Làm cách nào để thay đổi hoặc đặt biểu tượng cho một tệp hoặc thư mục, trong thiết bị đầu cuối, tôi có cần sử dụng ngôn ngữ kịch bản không?
Câu trả lời:
Bạn sẽ cần Công cụ dành cho nhà phát triển được cài đặt và sau đó có thể hoạt động. Điều này có đồ họa trong icon.png
và áp dụng nó cho 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
khi làm việc với .avi
các tập tin. ### Rez - Fatal error trying to open the resource file "Video.avi" for writing.
`có ý tưởng nào không?
$PATH
(sơ khai trong /usr/bin
đó biết nơi tìm các công cụ thực tế), và không ở /Developer/Tools
nữa, vì vậy bạn nên gọi chúng chỉ bằng tên tệp của chúng; tức là, trong trường hợp trong tầm tay, như vừa Rez
và DeRez
.
Với lợi ích của một vài năm nhận thức muộn màng:
câu trả lời user588 của và câu trả lời koiyu của công việc tốt, nhưng họ dựa vào các tiện ích ( Rez
, DeRez
và SetFile
) rằng:
Rez
và DeRez
, vì chúng liên quan đến Carbon)osxiconutils trông thú vị, nhưng sẽ không biên dịch nữa (kể từ OSX 10.10.4) .
Do đó, tôi đã tạo CLIfileicon
, hoạt động trên máy OSX nguyên sơ (không có điều kiện tiên quyết) ; đó là một kịch bản Bash dựa chủ yếu vào xattr
, xxd
và một kịch bản Python nhúng mà các cuộc gọi Cocoa, lịch sự của câu trả lời hữu ích này .
Nó cho phép thiết lập / xóa / trích xuất các biểu tượng tùy chỉnh cho / từ các tệp hoặc thư mục , kể cả trên các khối APFS trên macOS 10.13 (High Sierra).
Bạn có thể cài đặt nó như sau:
[sudo] npm install -g fileicon
fileicon
(liên kết này sẽ vẫn hiện hành).chmod +x fileicon
.$PATH
, chẳng hạn như /usr/local/bin
(yêu cầu sudo
).Đây là thông tin sử dụng; để biết thông tin đầy đủ, tham khảo hướng dẫn :
$ 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
, vẫn hoạt động (và trên thực tế, đã được tạo, vì osxiconutils
không còn hoạt động nữa) - Tôi đã cập nhật câu trả lời để làm cho rõ ràng hơn .
Tôi gần như đã bắt đầu một tiền thưởng về điều này, bởi vì tôi đã không quản lý để thay đổi biểu tượng của một thư mục bằng câu trả lời của @ mankoff . Nhưng tôi đã tìm thấy một giải pháp.
Để thay đổi biểu tượng của thư mục, bạn không trỏ Rez -append tmp.rsrc
đến thư mục mà là một Icon\r
tệp đặc biệt trong thư mục. Nếu bạn chưa đặt biểu tượng tùy chỉnh vào thư mục trước đó, tệp có thể sẽ không tồn tại, nhưng Rez
sẽ tạo biểu tượng đó trên đường bay của con người. Xóa Icon\r
tập tin sẽ xóa biểu tượng tùy chỉnh, vì vậy để tránh tai nạn, tốt nhất là ẩn đi.
Đây là những sửa đổi cho câu trả lời của nhân loại:
# 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'
Ngoài Ruby, đây là phiên bản 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 được cài đặt sẵn trong Mac OS đã có PyObjC nên bạn không phải cài đặt bất kỳ gói nào.
Kiểm tra setfileicon
(mã nguồn) , một tiện ích được tạo bởi Damien Bobillot.
Tải xuống tệp nhị phân tại đây: http://maxao.free.fr/telechargements/setfileicon.gz
Sau khi giải nén tệp, làm cho nó thực thi:
chmod +x setfileicon
Sau đó, bạn có thể sử dụng nó như sau:
./setfileicon "my-icon.icns" "my-file-or-directory"
Tôi có một dự án github nơi tôi tạo các "giọt" AppleScript từ các tập lệnh [shell / bash, python, perl, ruby, v.v.] lấy các đường dẫn tệp làm đối số. Tôi đã viết hàm bash này để thay đổi biểu tượng của một thư mục (vì các gói AppleScript là các Thư mục có phần mở rộng .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'
}
Sau khi xác định, bạn gọi hàm với 2 đối số:
replace_icon /path/to/AppleScript.app /path/to/icon.png
hoặc là
replace_icon /path/to/AppleScript.app http://i.imgur.com/LmUvWqB.png
Như bạn có thể thấy đối số thứ hai có thể là một hình ảnh trên hệ thống của bạn hoặc một URL.
LƯU Ý: Điều trông có vẻ điên rồ $'/Icon\r'
mà tôi làm là vì tên của tệp Biểu tượng kết thúc bằng trả về vận chuyển theo nghĩa đen\r
. Xem cho chính mình với:
find my-applescript.app -maxdepth 1 | less -U
Giả sử rằng chúng ta đã có tệp icns. Tạo tệp tài nguyên tạm thời trỏ đến tệp icns:
$ echo "read 'icns' (-16455) \"Icon.icns\";" >> Icon.rsrc
Nối tệp tài nguyên dưới dạng giá trị của thuộc tính mở rộng "com.apple.ResourceFork" vào một tệp:
$ Rez -a Icon.rsrc -o FileName.ext
Hiển thị biểu tượng của tệp:
$ SetFile -a C FileName.ext
Nối tệp tài nguyên dưới dạng giá trị của thuộc tính mở rộng "com.apple.ResourceFork" vào tệp biểu tượng ma thuật trong thư mục hiện tại:
$ Rez -a Icon.rsrc -o Icon$'\r'
Hiển thị biểu tượng của thư mục hiện tại:
$ SetFile -a C .
Ẩn tệp biểu tượng ma thuật trong thư mục hiện tại (nhấn. Để hiển thị / ẩn các tệp ẩn trong Finder):
$ SetFile -a V Icon$'\r'
Dữ liệu biểu tượng được lưu trữ dưới dạng giá trị của thuộc tính mở rộng "com.apple.ResourceFork" (Lệnh Terminal "xattr -p com.apple.ResourceFork FileName.ext" in giá trị). Đối với một thư mục có tệp ma thuật (trống và ẩn) Icon$'\r'
bên trong thư mục. Để trích xuất dữ liệu biểu tượng từ thuộc tính mở rộng "com.apple.ResourceFork" vào tệp tài nguyên văn bản thuần túy (từ đó chúng tôi biết định danh loại icns chính xác "-16455"):
$ DeRez -only icns FileWithIcon.ext > Icon.rsrc
$ DeRez -only icns /Folder/With/Icon/Icon$'\r' > Icon.rsrc
Trong macOS 10.13 Lệnh High Sierra $ sips -i ImageFile.icns/png/jpg
tạo ra lỗi "--addIcon không còn được hỗ trợ". Chuyển "-i" có nghĩa là "--addIcon" thành thuộc tính mở rộng "com.apple.ResourceFork" sang tệp này bằng chính nội dung của tệp hình ảnh này.
Một tùy chọn khác là sử dụng MacRuby:
/usr/local/bin/macruby -e 'framework "Cocoa";NSWorkspace.sharedWorkspace.setIcon(NSImage.alloc.initWithContentsOfFile("/tmp/a.png"),forFile:"/tmp/file",options:0)'
Bạn có thể tải xuống trình cài đặt cho MacRuby từ http://macruby.org .
Thật kỳ lạ, giải pháp tốt nhất dường như không sử dụng các công cụ riêng của Apple mà là mã Python vì nó có nhiều ưu điểm khác nhau không bị giới hạn bởi:
Cập nhật
Bây giờ (trên macOS Sierra) câu trả lời của @ koiyu dường như hoạt động, vì vậy bạn có thể sử dụng hai lớp lót này để sao chép biểu tượng từ thư mục nguồn vào thư mục đích của mình:
#!/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
Trong phiên bản macOS gần đây (10.14), sips -i icon.png
sẽ gặp --addIcon is no longer supported
lỗi.
Nó cũng cần Công cụ dành cho nhà phát triển được cài đặt. Điều này đưa đồ họa vào Icon.png
và áp dụng nó vào file.ext
, giống như câu trả lời của 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
Giống như giải pháp Python sử dụng PyObjC, hóa ra nó có thể được thực hiện chỉ bằng AppleScript (không bị phản đối trong 10.15 Catalina, không giống như Python và các ngôn ngữ kịch bản lệnh khác).
Tôi đã tìm thấy một ví dụ về cách thực hiện việc này trên GitHub tại đây:
#!/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 không dễ đọc, nhưng rõ ràng có thể truy cập mã Objective-C để thực hiện điều này thông qua khung AppKit.