Terminal'i kullanarak bir dosya veya klasör simgesini nasıl değiştirebilirim


53

Terminalde bir komut dosyası dili kullanmam gerekir mi, bir dosya veya klasör simgesini nasıl değiştirebilir veya ayarlayabilirim?


Ayrıca bakınız sveinbjorn.org/osxiconutils

İyi ölçeklenmediğini unutmayın. Bir dizindeki birçok dizine simge uygulaması denendi - Finder çok yavaş çalıştı.
kolen

Yanıtlar:


31

Yüklü Geliştirici Araçlarına ihtiyacınız olacak ve ardından aşağıdakiler işe yarayabilir. Bu, grafiği alır icon.pngve uygular 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.

Müthiş, tam istediğim buydu.
ocodo

Dosyalarla Rez -appendçalışırken sorun yaşıyorum .avi. ### Rez - Fatal error trying to open the resource file "Video.avi" for writing.`herhangi bir fikir?
ocodo

İlginçtir ki, ayrıca Bilgi Alın kopyala / yapıştır yöntemiyle dosyayı yeni bir simge kabul edememiştir.
ocodo

simgesi boyutunda bir kısıtlama var mı? Büyük bir jpg (1024x768) kullanırsam, gerçekten küçük bir şeye yeniden boyutlandırılır .. Bir şekilde orijinal boyutunu koruyabilir miyim?
nuc

2
Son OSX sürümlerinde, geliştirici araçlarının $PATH( /usr/binasıl araçları nerede bulacağını bilenler) olduğunu ve /Developer/Toolsartık olmadığını unutmayın, bu yüzden onları yalnızca dosya adlarıyla çağırmalısınız; yani, eldeki durumda olduğu gibi Rezve DeRez.
mklement0

19

Birkaç yıl boyunca elde edeceğiniz fayda ile:

user588 cevabı ve koiyu cevabı iyi çalışabilir, ancak kamu hizmetleri güveniyor ( Rez, DeRezve SetFileo):

  • varsayılan olarak kurulmazlar (Xcode veya geliştirici komut satırı yardımcı programlarıyla gelirler)
  • şimdi kullanımdan kaldırıldı ( Rezve DeRez, çünkü onlar Karbon ile ilgili)

osxiconutils ilginç görünüyor, ancak artık derlenmiyor (OSX 10.10.4'ten itibaren) .


Bu nedenle , bozulmamış bir OSX makinesinde çalışması gereken CLI'yifileicon oluşturdum (önkoşul yok) ; öncelikle dayalı bir Bash script xattr, xxdve Kakao, nezaket çağıran gömülü Python komut bu yararlı cevap .

MacOS 10.13 (High Sierra) üzerindeki APFS birimleri de dahil olmak üzere, dosyalar veya klasörler için / dan özel simgelerin ayarlanmasına / kaldırılmasına / çıkarılmasına izin verir .

Aşağıdaki gibi yükleyebilirsiniz:

  • Eğer node.js, yüklediyseniz npm kayıt defterinden ile
    [sudo] npm install -g fileicon
  • Aksi takdirde:
    • CLI'yi farklı bir şekilde indirin fileicon(bu bağlantı geçerli kalacaktır).
    • Çalıştırılabilir hale getirin chmod +x fileicon.
    • Onu taşıyın veya işaretleyin ( $PATHgibi) içinde bir klasöre ./usr/local/binsudo

İşte kullanım bilgileri; tam bilgi için kılavuza bakınız :

$ 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: [Silinen bir yoruma yanıt olarak] Herkesin Node.js'yi kurmasını veya istemesini istemiyorum, bu nedenle doğrudan indirme bağlantısı orada da var (cevabımdaki 'Aksi halde: `liste öğesine bakın). - Kendi kendine yeten bir Bash betiği (bu şekilde yükleyerek tek yapmanız gereken, man sayfasının yüklenmesidir, ancak manuel sayfanın düz metin oluşturmasını elde edebilirsiniz fileicon --man).
mklement0

@Slomojo: [Silmeden önce gelen bir yoruma cevaben] Npm yoluyla kurulumun neden önerildiğine gelince: npm ekosistemini genel olarak favori paket yöneticim olarak buldum ve birkaç çapraz platform, komut dosyası yayınladım tabanlı CLI'ler Node.js ile ilgili olmayan. Ayrıca npm (n ve Node.js üzerinden) için npm'yi kullanmayı kolaylaştıran tek komutlu, kullanıcı düzeyinde bir yükleyici oluşturdumcurl -L http://git.io/n-install | bash .
mklement0

3
Bu kutu çalışma çözümü dışında güzel bir şey. +1
user3439894

1
@PatNiemeyer: Teşekkürler, osxiconutils bağlantısını güncelledik, ancak bu cevabınfileicon hala işe yarayan (ve aslında osxiconutilsartık çalışmadığı için yaratılmış olan) hizmet programı ile ilgili olduğuna dikkat edin - cevabı daha net hale getirmek için güncelledim. .
mklement0

1
Bu konudaki herkesin arkasında birkaç yıl geride olduğumun farkındayım, ama bugün bunu keşfettiğimi ve harika olduğunu söylemek istedim. Bunu yaptığın için teşekkürler! 👍
TJ Luoma

18

Ben neredeyse bir simgesini değiştirmek başaramadı çünkü bu bir ödül başladı klasöre @ kullanarak mankoff 'ın cevabı . Ama bir çözüm buldum.


Klasörün simgesini değiştirmek için klasöre işaret etmiyorsunuz Rez -append tmp.rsrc, klasörün Icon\riçinde özel bir dosya var. Daha önce klasöre özel bir simge ayarlamadıysanız, dosya büyük olasılıkla bulunmaz, ancak Rezanında oluşturur. Icon\rDosyayı silmek özel simgeyi kaldırır, böylece kazaları önlemek için gizlenmesinin iyi olması gerekir.

Bunlar mankoff'un cevabındaki değişiklikler:

# 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'

Ve bir dosya için? Benim yorum re: avi dosyaları
ocodo

@slomojo üzgünüm, fakat elde ettiğiniz hatayı kopyalayamıyorum - mankoff'un çözümünü bir .avi dosyasıyla test ettim. Girdiğiniz dosya izinlerini ve komutlarını tekrar kontrol etsin mi?
Jari Keinänen

Başka bir yol daha vereceğim, belki daha önce bir hata yaptım.
ocodo

Umutsuzca bir USB flaş sürücü için bunu yapmaya çalışıyorum. Tüm komutlar "çalışma" yla hata döndürmezler, fakat ben hala değişmeyen bir simgeye sahip bir sürücü ile bırakıldım. Herhangi bir düşünce ve sonsuza dek minnettar olacağım!
singmotor

8

Ruby'ye ek olarak, bir Python sürümü:

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

Mac OS'de önceden kurulmuş olan Python'da zaten PyObjC var, bu nedenle herhangi bir paket yüklemeniz gerekmez.


Unicode'a UTF-8'in kod çözme kodunu ekledim, aksi takdirde ASCII olmayan dosya isimleriyle çalışmadı. Dönüş değeri Ayrıca eklenen çek, simge ayarlamak için başarısızlık 1. dönüş kodu ile sonuçlanacaktır
Kolen

1
Yine de en boy oranının değiştirilmemiş olduğu simgesini belirleyebilir miyiz? Harika çalışıyor, ancak görüntü dosyaları bir kareye yeniden şekilleniyor. Teşekkürler!
Gustavo Bezerra

1
Cevabı tam olarak bulamadım, ancak görüntüleri elle doldurmadan önce şeffaf dolgu ile karelemek gayet iyi çalıştı: stackoverflow.com/questions/12179342/…
Gustavo Bezerra

7

Damien Bobillot tarafından oluşturulan bir yardımcı program, göz atın setfileicon(kaynak kodu) .

İkili dosyayı buradan indirin: http://maxao.free.fr/telechargements/setfileicon.gz

Dosyayı paketinden çıkardıktan sonra, çalıştırılabilir hale getirin:

chmod +x setfileicon

Sonra aşağıdaki gibi kullanabilirsiniz:

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

Bunun için gerçekten çok yararlı. BTW, gürültüyü azaltmak için GUI yöntemini düzenlemekteyim.
ocodo

Ne yazık ki çoğu kod artık kullanımdan kaldırılmıştır.
Mugen

3

Dosya yollarını argüman olarak alan [shell / bash, python, perl, ruby, vs.] betiklerinden AppleScript "damlacıkları" oluşturduğum bir github projem var . Bir klasörün simgesini değiştirmek için bu bash işlevini yazdım (çünkü AppleScript paketleri .app uzantılı klasörlerdir).

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'
}

Tanımlandıktan sonra, işlevi 2 argümanla çağırırsınız:

replace_icon /path/to/AppleScript.app /path/to/icon.png

veya

replace_icon /path/to/AppleScript.app http://i.imgur.com/LmUvWqB.png

Gördüğünüz gibi ikinci argüman sisteminizde bir resim veya bir URL olabilir.

NOT: Yaptığım o çılgın görünümlü $'/Icon\r'şey, Icon dosyasının adı değişmez satır başı ile bitiyor \r. Şununla kendiniz görün:

find my-applescript.app -maxdepth 1 | less -U

3

Zaten icns dosyamız olduğunu varsayalım. İcns dosyasına işaret eden geçici kaynak dosyası oluşturun:

$ echo "read 'icns' (-16455) \"Icon.icns\";" >> Icon.rsrc

Kaynak dosyayı "com.apple.ResourceFork" genişletilmiş özniteliğinin değeri olarak bir dosyaya ekleyin:

$ Rez -a Icon.rsrc -o FileName.ext

Dosyanın simgesini göster:

$ SetFile -a C FileName.ext

Kaynak dosyayı, "com.apple.ResourceFork" adlı genişletilmiş özniteliğin değeri olarak, geçerli klasördeki sihirli bir simge dosyasına ekleyin:

$ Rez -a Icon.rsrc -o Icon$'\r'

Geçerli klasörün simgesini göster:

$ SetFile -a C .

Sihirli klasör dosyasını geçerli klasörün içinde gizleyin (Gizli dosyaları Finder'da göstermek / gizlemek için ⇧⌘.

$ SetFile -a V Icon$'\r'

Ek detaylar

Simge verileri, "com.apple.ResourceFork" ("xattr -p com.apple.ResourceFork FileName.ext" komutunun "" komutu) özniteliğinin değeri olarak depolanır. Bir klasör için, klasörün içinde sihirli (boş ve gizli) bir dosya vardır Icon$'\r'. "Com.apple.ResourceFork" adlı genişletilmiş öznitelikteki simge verilerini düz metin kaynak dosyasına (içinden "doğru icns tipi tanımlayıcı" -16455 "olarak bildiğimiz) çıkarmak için:

$ DeRez -only icns FileWithIcon.ext > Icon.rsrc
$ DeRez -only icns /Folder/With/Icon/Icon$'\r' > Icon.rsrc

MacOS altında 10.13 Yüksek Sierra komutu $ sips -i ImageFile.icns/png/jpg"--addIcon artık desteklenmiyor" hatasını veriyor. "-İ" anahtarı, bu görüntü dosyasının içeriğini kullanarak bu dosyanın kendisinin üzerinde "com.apple.ResourceFork" genişletilmiş özniteliği olarak "--addIcon" anlamına gelir.


# <stdin>: 1: ### /Applications/Xcode.app/Contents/Developer/usr/bin/Rez - Okuma sırasında SysError 0.
Ocak’ta

2

MacRuby kullanmak başka bir seçenek:

/usr/local/bin/macruby -e 'framework "Cocoa";NSWorkspace.sharedWorkspace.setIcon(NSImage.alloc.initWithContentsOfFile("/tmp/a.png"),forFile:"/tmp/file",options:0)'

MacRuby için bir yükleyiciyi http://macruby.org adresinden indirebilirsiniz .


1
Link - ve MacRuby - görünüşe göre şimdi öldü; MacRuby görünüşte ticari, abonelik tabanlı RubyMotion tarafından başarıldı .
mklement0

2

Garip bir şekilde, en iyi çözüm Apple'ın kendi araçlarını kullanmak değil Python kodunu kullanmak gibi görünüyor çünkü bununla sınırlı kalmaması gereken çeşitli avantajları var:

  • çıktı dosyası çözünürlüğü
    (1024x1024'e kadar çalışır)
  • giriş dosyası formatı
    (ICNS ve PNG ile denendi)
  • yükleme izinleri
    (bir işlev olarak tanımlayın)

Güncelleme

Şimdi (macOS Sierra'da) @ koiyu'nun cevabı işe yarıyor gibi görünüyor, bu nedenle bu iki liner'ı bir kaynak klasörden hedef klasörünüze kopyalamak için kullanabilirsiniz:

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

Farklı sormaya hoş geldiniz! Bu yorum olarak daha iyi olurdu gibi görünüyor. Henüz gerekli olan noktalara sahip olmadığınızı biliyorum, ancak bir bakmaya gelebilecek gücü olan birine sordum. Ek olarak, bütün bunları sizin için temiz bir pakette yapan bir Applescript yazdım , bu SE'de benzer bir soruya cevabımı
JMY1000,

Evet, denedim ama yapamadım. Ayrıca, yorumunuzun 2. bölümünün birincisi ile ilgisi olmayan bir cevap olarak daha iyi olacağını düşünüyorum.
dardo82

2

Son macOS sürümünde (10.14) hata sips -i icon.pngalırsınız --addIcon is no longer supported.

Aynı zamanda yüklü Geliştirici Araçları gerekli. Bu grafiği alır Icon.pngve uygular file.extgibi, user588 cevabı :

# 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

PyObjC kullanan Python çözümü gibi, sadece AppleScript ile yapılabilir (Python ve diğer betik dillerinin aksine, 10.15 Catalina'da onaylanmayan).

GitHub’da bunun nasıl yapılacağına dair bir örnek buldum:

set-bulucu-simge

#!/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'in okunması kolay değildir, ancak görünüşe göre bunu AppKit çerçevesi üzerinden yapmak için Objective-C koduna erişmek mümkündür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.