Bir klasörü terminal üzerinden etiketlemek mümkün mü?


11

Terminal komutuyla mavericks içindeki bir dosyayı veya klasörü etiketlemek mümkün müdür?


1
Evet öyle. Etiketler xattr kullanılarak saklanır / okunur ve com.apple.metadata: _kMDItemUserTags içinde saklanır. Daha spesifik bir soruda (belki "foo" adlı bir etiketi belirli bir dosyaya kolayca ayarlamak için belki python kullanın) veya sadece teknik olarak mümkün olup olmadığını merak ediyor musunuz?
bmike

ile ilgili soru burada
Asmus

1
@bmike teşekkürler, evet Programlı olarak düzenlemek istiyorum: P
GedankenNebel

Yığın Taşması'nda, benden bir cevap vererek: OS X “etiketlerini” dosyalara programlı olarak nasıl ekleyebilirim? (2013-11-01)
Graham Perrin

Yanıtlar:


23

Xattr kullanabilirsiniz. Bu, etiketleri dosya1'den dosya2'ye kopyalar:

xattr -wx com.apple.metadata:_kMDItemUserTags "$(xattr -px com.apple.metadata:_kMDItemUserTags file1)" file2;xattr -wx com.apple.FinderInfo "$(xattr -px com.apple.FinderInfo file1)" file2

Etiketler, özellik listesinde tek bir dizgi dizisi olarak saklanır:

$ xattr -p com.apple.metadata:_kMDItemUserTags file3|xxd -r -p|plutil -convert xml1 - -o -
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <string>Red
6</string>
    <string>new tag</string>
    <string>Orange
7</string>
    <string>Yellow
5</string>
    <string>Green
2</string>
    <string>Blue
4</string>
    <string>Purple
3</string>
    <string>Gray
1</string>
</array>
</plist>

Com.apple.FinderInfo içindeki kColor bayrağı ayarlanmamışsa, Finder renkler için daireler göstermez. KColor bayrağı turuncuya ayarlanmışsa ve dosyada kırmızı etiket varsa, Finder hem kırmızı hem de turuncu daireleri gösterir. AppleCoin ile kColor bayrağını ayarlayabilirsiniz:

xattr -w com.apple.metadata:_kMDItemUserTags '("Red\n6","new tag")' ~/desktop/file4;osascript -e 'on run {a}' -e 'tell app "Finder" to set label index of (POSIX file a as alias) to item 1 of {2, 1, 3, 6, 4, 5, 7}' -e end ~/desktop/file4

xattr -p com.apple.FinderInfo file|head -n1|cut -c28-29kColor bayrağı için kullanılan bitlerin değerini yazdırır. Kırmızı C, turuncu E, sarı A, yeşil 4, mavi 8, macenta 6 ve gri 2'dir. Değerlere 1 ekleyecek olan bayrak OS X'te kullanılmaz.

Düzenle: etiketini de kullanabilirsiniz :

tag -l file # list
tag -a tag1 file # add
tag -s red,blue file # set
tag -r \* file # remove all tags
tag -f green # find all files with the green tag
tag -f \* # find all files with tags
tag -m red * # match (print files in * that have the red tag)

etiketiyle monte edilebilir brew install tagveya sudo port install tag.

$ tag -h
tag - A tool for manipulating and querying file tags.
  usage:
    tag -a | --add <tags> <file>...     Add tags to file
    tag -r | --remove <tags> <file>...  Remove tags from file
    tag -s | --set <tags> <file>...     Set tags on file
    tag -m | --match <tags> <file>...   Display files with matching tags
    tag -l | --list <file>...           List the tags on file
    tag -f | --find <tags>              Find all files with tags
  <tags> is a comma-separated list of tag names; use * to match/find any tag.
  additional options:
        -v | --version      Display version
        -h | --help         Display this help
        -n | --name         Turn on filename display in output (default)
        -N | --no-name      Turn off filename display in output (list)
        -t | --tags         Turn on tags display in output (find, match)
        -T | --no-tags      Turn off tags display in output (list)
        -g | --garrulous    Display tags each on own line (list, find, match)
        -G | --no-garrulous Display tags comma-separated after filename (default)
        -H | --home         Find tagged files only in user home directory
        -L | --local        Find tagged files only in home + local filesystems (default)
        -R | --network      Find tagged files in home + local + network filesystems
        -0 | --nul          Terminate lines with NUL (\0) for use with xargs -0

6

Etiketleri saf bash komutlarıyla değiştirmek mümkündür. Üçüncü taraf "tag" utiline gerek yoktur.

Bu komut bir dosyanın tüm etiketlerini listeler ($ src):

xattr -px com.apple.metadata:_kMDItemUserTags "$src" | \
    xxd -r -p - - | plutil -convert json -o - - | sed 's/[][]//g' | tr ',' '\n'

Ve bir dosyaya ($ src) nasıl etiket ($ newtag) ekleyeceğiniz aşağıda açıklanmıştır:

xattr -wx com.apple.metadata:_kMDItemUserTags \
    "$(xattr -px com.apple.metadata:_kMDItemUserTags "$src" | \
    xxd -r -p - - | plutil -convert json -o - - | sed 's/[][]//g' | tr ',' '\n' | \
    (cat -; echo \"$newtag\") | sort -u | grep . | tr '\n' ',' | sed 's/,$//' | \
    sed 's/\(.*\)/[\1]/' | plutil -convert binary1 -o - - | xxd -p - -)" "$src"

İşte "tags" işlevini veren küçük bir kabuk betiği. Kullanımı:

tags <file>
Lists all tags of a file

tags -add <tag> <file>
Adds tag to a file

İşlev, kaldırmayı da desteklemek için kolayca genişletilebilir.

tags() {
    # tags system explained: http://arstechnica.com/apple/2013/10/os-x-10-9/9/
    local src=$1
    local action="get"

    if [[ $src == "-add" ]]; then
        src=$3
        local newtag=$2
        local action="add"
    fi

    # hex -> bin -> json -> lines
    local hexToLines="xxd -r -p - - | plutil -convert json -o - - | sed 's/[][]//g' | tr ',' '\n'"

    # lines -> json -> bin -> hex
    local linesToHex="tr '\n' ',' | echo [\$(sed 's/,$//')] | plutil -convert binary1 -o - - | xxd -p - -"

    local gettags="xattr -px com.apple.metadata:_kMDItemUserTags \"$src\" 2> /dev/null | $hexToLines | sed 's/.*Property List error.*//'"

    if [[ $action == "get" ]]; then
        sh -c "$gettags"
    else
        local add="(cat -; echo \\\"$newtag\\\") | sort -u"
        local write="xattr -wx com.apple.metadata:_kMDItemUserTags \"\$($gettags | $add | grep . | $linesToHex)\" \"$src\""

        sh -c "$write"
    fi
}
export -f tags

Yikes, bunlar uzun çizgiler! Bir sarma düzenlemesi önerdim. Yine de küçük kabuk komut dosyaları olarak daha iyi yapılabilir.
zigg

Kişisel xattr -wxdosya zaten üzerinde herhangi etiketine sahip değil iken komut başarısız olur. Bundan nasıl kaçınabilirim?
user3932000

En son OS X'de (El Cap 10.11.4) bir sorun var gibi görünüyor. xattr -px …Klasörlerimden birinde etiketleri göstermek için verdiğiniz komutu çalıştırmak şu çıktıyı verir: "language:Objective-C\n2"(yeni satır) "platform:iOS\n4". Dürüst olmak gerekirse, orta derecede karmaşık kabuk kodunuzu bir bash işlevine sarılacaksanız, topluluğun bakımlı olması avantajına sahip olan etiket çabasını çoğaltıyorsunuz.
Slipp D.Thompson

SlippD.Thompson @, nasıl bir bash fonksiyonu içine kabuk kodunu tamamlıyor şey bir to-be derlenmiş aracının "çaba çoğaltma" ile ilgisi? ... Bu ve 'için karşıt görüş analizini vermek gerekmez etiketini seçin, ne istersen seç. Bu çözümün açıklaması , istenen işlevselliği elde etmek için 3. taraf bir araca ihtiyacınız olmadığıdır .
Márton Sári
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.