Kemungkinan untuk menandai folder melalui terminal?


11

Apakah mungkin untuk menandai file atau folder di maverick melalui perintah terminal?


1
Ya itu. Tag disimpan / dibaca menggunakan xattr dan disimpan di com.apple.metadata: _kMDItemUserTags. Apakah Anda ingin mengedit dalam pertanyaan yang lebih spesifik (mungkin menggunakan python untuk dengan mudah mengatur tag bernama "foo" ke file tertentu) atau apakah Anda hanya ingin tahu apakah secara teknis memungkinkan?
bmike

pertanyaan terkait di sini
Asmus

1
@bmike terima kasih, ya saya ingin mengedit secara terprogram: P
GedankenNebel

Di Stack Overflow, dengan jawaban dari saya: Bagaimana saya bisa menambahkan "tag" OS X ke file secara terprogram? (2013-11-01)
Graham Perrin

Jawaban:


23

Anda bisa menggunakan xattr. Ini menyalin tag dari file1 ke file2:

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

Tag disimpan dalam daftar properti sebagai satu larik string:

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

Jika bendera kColor di com.apple.FinderInfo tidak disetel, Finder tidak menampilkan lingkaran untuk warna. Jika bendera kColor diatur ke oranye dan file memiliki tag merah, Finder menunjukkan lingkaran merah dan oranye. Anda dapat mengatur bendera kColor dengan AppleScript:

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-29mencetak nilai bit yang digunakan untuk bendera kColor. Merah adalah C, oranye adalah E, kuning adalah A, hijau adalah 4, biru adalah 8, magenta adalah 6, dan abu-abu adalah 2. Bendera yang akan menambahkan 1 ke nilai tidak digunakan dalam OS X.

Sunting: Anda juga dapat menggunakan tag :

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)

tag dapat diinstal dengan brew install tagatau 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

Dimungkinkan untuk memanipulasi tag melalui perintah bash murni. Tidak perlu util "tag" pihak ke-3.

Perintah ini mencantumkan semua tag file ($ src):

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

Dan di sini adalah bagaimana Anda dapat menambahkan tag ($ newtag) ke file ($ src):

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"

Berikut ini adalah skrip shell kecil yang mengekspor fungsi "tag". Pemakaian:

tags <file>
Lists all tags of a file

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

Fungsi ini dapat dengan mudah diperluas untuk mendukung penghapusan juga.

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

Astaga, itu adalah antrian panjang! Saya menyarankan edit pembungkus. Saya pikir mereka lebih baik dilakukan sebagai skrip shell kecil.
zigg

xattr -wxPerintah Anda gagal saat file belum memiliki tag di dalamnya. Bagaimana saya bisa menghindari ini?
user3932000

Tampaknya memiliki beberapa masalah dalam OS X terbaru (El Cap 10.11.4). Menjalankan xattr -px …perintah yang Anda berikan untuk menampilkan tag pada salah satu folder saya memberikan output berikut: "language:Objective-C\n2"(baris baru) "platform:iOS\n4". Sejujurnya, jika Anda akan membungkus kode shell Anda yang cukup kompleks menjadi fungsi bash, Anda semacam hanya menduplikasi upaya tag , yang memiliki keuntungan dipelihara dengan baik oleh komunitas.
Slipp D. Thompson

@ SlippD.Thompson, bagaimana membungkus kode shell ke fungsi bash ada hubungannya dengan "duplikasi usaha" dari alat yang dikompilasi? ... Anda tidak perlu memberikan analisis pro-con untuk ini dan ' tag ', Anda memilih apa pun yang Anda suka. Pernyataan solusi ini adalah bahwa Anda tidak memerlukan alat pihak ke-3 untuk mencapai fungsionalitas yang diinginkan.
Márton Sári
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.