Làm cách nào để thay đổi tệp hoặc biểu tượng thư mục bằng Terminal


53

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ưu ý rằng nó không có quy mô tốt. Đã thử áp dụng các biểu tượng cho nhiều thư mục trong một thư mục - Finder hoạt động rất chậm.
đánh cắp

Câu trả lời:


31

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.pngvà á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.

Tuyệt vời, đó chỉ là những gì tôi muốn.
ocodo

Tôi gặp rắc rối với Rez -appendkhi làm việc với .avicác tập tin. ### Rez - Fatal error trying to open the resource file "Video.avi" for writing.`có ý tưởng nào không?
ocodo

Thật thú vị, nó cũng làm cho tệp không thể chấp nhận một biểu tượng mới thông qua phương thức sao chép / dán thông tin.
ocodo

Có giới hạn về kích thước biểu tượng? Nếu tôi sử dụng một jpg lớn (1024x768), nó sẽ được thay đổi kích thước thành một cái gì đó thực sự nhỏ .. Tôi có thể giữ lại kích thước ban đầu bằng cách nào đó không?
nuc

2
Lưu ý rằng trong các phiên bản OSX gần đây, các công cụ dành cho nhà phát triển nằm trong $PATH(sơ khai trong /usr/binđó biết nơi tìm các công cụ thực tế), và không ở /Developer/Toolsnữ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 RezDeRez.
mkuity0

19

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ủacâ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, DeRezSetFile) rằng:

  • không được cài đặt theo mặc định (chúng đi kèm với Xcode hoặc các tiện ích dòng lệnh của nhà phát triển)
  • hiện không được chấp nhận ( RezDeRez, 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, xxdvà 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:

  • Nếu bạn đã cài đặt Node.js, từ sổ đăng ký npm , với
    [sudo] npm install -g fileicon
  • Nếu không thì:
    • Tải xuống CLI dưới dạng fileicon(liên kết này sẽ vẫn hiện hành).
    • Làm cho nó thực thi với chmod +x fileicon.
    • Di chuyển nó hoặc symlink nó vào một thư mục trong của bạn $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

@Slomojo: [Đáp lại nhận xét đã bị xóa] Tôi hiểu rằng không phải ai cũng có hoặc muốn cài đặt Node.js, đó là lý do tại sao liên kết tải xuống trực tiếp cũng có (xem mục 'Danh sách: `trong câu trả lời của tôi) - đó là tập lệnh Bash độc lập (điều duy nhất bạn bỏ qua khi cài đặt theo cách này là cài đặt trang man, nhưng bạn có thể hiển thị văn bản đơn giản của trang thủ công fileicon --man).
mkuity0

@Slomojo: [Đáp lại bình luận đã bị xóa] Về lý do cài đặt qua npm được cung cấp: Tôi đã tìm thấy hệ sinh thái npm là trình quản lý gói yêu thích của tôi và tôi đã xuất bản một số tập lệnh đa nền tảng, đa nền tảng CLI dựa trên đó không liên quan đến Node.js. Tôi cũng đã tạo một trình cài đặt cấp người dùng, một lệnh cho npm (thông qua n và Node.js) để giúp dễ dàng sử dụng npm ngay cả đối với những người không có hứng thú với Node.js : curl -L http://git.io/n-install | bash.
mkuity0

3
Đây là một giải pháp làm việc tốt đẹp. +1
dùng3439894

1
@PatNiemeyer: Cảm ơn, tôi đã cập nhật liên kết osxiconutils, nhưng lưu ý rằng câu trả lời này là về tiện íchfileicon , vẫn hoạt động (và trên thực tế, đã được tạo, vì osxiconutilskhô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 .
mkuity0

1
Tôi nhận ra tôi chậm hơn một vài năm so với những người khác trong chủ đề này, nhưng chỉ muốn đề cập rằng tôi đã phát hiện ra điều này ngày hôm nay và nó thật tuyệt. Cảm ơn vì đã làm nó! 👍
TJ Luoma

18

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\rtệ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 Rezsẽ tạo biểu tượng đó trên đường bay của con người. Xóa Icon\rtậ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'

Và cho một tập tin? Lưu ý nhận xét của tôi re: tập tin avi
ocodo

@slomojo xin lỗi, nhưng tôi không thể sao chép lỗi mà bạn nhận được chỉ cần thử nghiệm giải pháp của mankoff với một tệp .avi. Kiểm tra lại quyền và tập tin bạn đã nhập?
Jari Keinänen

Tôi sẽ cho nó đi tiếp, có lẽ tôi đã phạm sai lầm trước đây.
ocodo

Tôi đang cố gắng hết sức để làm điều này cho một ổ USB. Tất cả các lệnh "hoạt động" ở chỗ chúng không trả về lỗi, nhưng tôi vẫn còn một ổ ngón tay cái với biểu tượng không thay đổi. Bất kỳ suy nghĩ và tôi sẽ biết ơn mãi mãi!
singmotor

8

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.


Tôi đã thêm giải mã UTF-8 thành unicode, nếu không thì tập lệnh không hoạt động với tên tệp không phải ASCII. Đồng thời thêm kiểm tra giá trị trả về, không đặt biểu tượng sẽ dẫn đến mã trả về là 1.
kolen

1
Có dù sao chúng ta có thể chỉ định biểu tượng không có tỷ lệ khung hình được sửa đổi? Nó hoạt động rất tốt, nhưng các tệp hình ảnh được định hình lại thành một hình vuông. Cảm ơn!
Gustavo Bezerra

1
Không tìm thấy chính xác câu trả lời, nhưng bình phương các hình ảnh với phần đệm trong suốt trước khi hoạt động tốt: stackoverflow.com/questions/12179342/ Kẻ
Gustavo Bezerra

7

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"

Cảm ơn vì điều đó, thực sự rất hữu ích. BTW, tôi đang chỉnh sửa phương thức GUI, để giảm nhiễu.
ocodo

Thật không may, hầu hết các mã hiện không được chấp nhận.
Mugen

3

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

3

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'

Chi tiết bổ sung

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/jpgtạ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.


# <stdin>: 1: ### /Appluggest/Xcode.app/Contents/Developer/usr/bin/Rez - SysError 0 trong khi đọc.
lượng tử

2

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 .


1
Liên kết - và MacRuby - dường như đã chết; MacRuby rõ ràng đã thành công bởi RubyMotion dựa trên đăng ký .
mkuity0

2

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:

  • độ phân giải tệp đầu ra
    (nó hoạt động đến 1024x1024)
  • định dạng tệp đầu vào
    (đã thử với ICNS và PNG)
  • quyền cài đặt
    (xác định nó là một chức năng)

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

Chào mừng bạn đến hỏi khác nhau! Điều này có vẻ như nó sẽ tốt hơn như là một bình luận. Tôi biết bạn chưa có điểm cần thiết, nhưng tôi đã hỏi ai đó có sức mạnh để xem. Ngoài ra, tôi đã viết một Applescript thực hiện tất cả những điều này cho bạn trong một gói gọn gàng, xem câu trả lời của tôi cho một câu hỏi tương tự trên SE này.
JMY1000

Có, tôi đã cố gắng nhưng không thể làm được. Hơn nữa, tôi nghĩ rằng phần 2 của bình luận của bạn sẽ tốt hơn như là một câu trả lời, không liên quan đến phần thứ nhất.
dardo82

2

Trong phiên bản macOS gần đây (10.14), sips -i icon.pngsẽ gặp --addIcon is no longer supportedlỗ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.pngvà á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

0

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:

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 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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.