Có thể gắn thẻ thư mục qua thiết bị đầu cuối?


11

Có thể gắn thẻ một tập tin hoặc thư mục trong mavericks thông qua lệnh terminal?


1
Vâng, đúng vậy. Các thẻ được lưu trữ / đọc bằng xattr và được lưu trữ trong com.apple.metadata: _kMDItemUserTags. Bạn có muốn chỉnh sửa trong một câu hỏi cụ thể hơn (có thể sử dụng python để dễ dàng đặt thẻ có tên "foo" vào một tệp cụ thể) hoặc bạn chỉ tò mò liệu nó có thể về mặt kỹ thuật không?
bmike

câu hỏi liên quan ở đây
Asmus

1
@bmike cảm ơn, vâng tôi muốn chỉnh sửa theo chương trình: P
GedankenNebel

Câu trả lời:


23

Bạn có thể sử dụng xattr. Điều này sao chép các thẻ từ file1 sang 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

Các thẻ được lưu trữ trong một danh sách thuộc tính dưới dạng một chuỗi các chuỗi:

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

Nếu cờ kColor trong com.apple. DownloaderInfo không được đặt, Finder sẽ không hiển thị các vòng tròn cho màu sắc. Nếu cờ kColor được đặt thành màu cam và tệp có thẻ màu đỏ, Finder sẽ hiển thị cả vòng tròn màu đỏ và màu cam. Bạn có thể đặt cờ kColor bằng 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-29in giá trị của các bit được sử dụng cho cờ kColor. Màu đỏ là C, màu cam là E, màu vàng là A, màu xanh lá cây là 4, màu xanh là 8, màu đỏ là 6 và màu xám là 2. Cờ sẽ thêm 1 vào các giá trị không được sử dụng trong OS X.

Chỉnh sửa: bạn cũng có thể sử dụng thẻ :

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)

thẻ có thể được cài đặt với brew install taghoặc 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

Có thể thao tác các thẻ thông qua các lệnh bash thuần túy. Không cần sử dụng "thẻ" bên thứ 3.

Lệnh này liệt kê tất cả các thẻ của một tệp ($ src):

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

Và đây là cách bạn có thể thêm thẻ ($ newtag) vào tệp ($ 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"

Đây là một tập lệnh shell nhỏ xuất khẩu hàm "tags". Sử dụng:

tags <file>
Lists all tags of a file

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

Các chức năng có thể dễ dàng mở rộng để hỗ trợ loại bỏ là tốt.

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

Rất tiếc, đó là những hàng dài! Tôi đề nghị chỉnh sửa gói. Tôi nghĩ rằng họ có thể được thực hiện tốt hơn như các kịch bản shell nhỏ, mặc dù.
zigg

xattr -wxLệnh của bạn không thành công khi tệp không có bất kỳ thẻ nào trên đó. Làm thế nào tôi có thể tránh điều này?
dùng3932000

Có vẻ như có một số vấn đề trong OS X mới nhất (El Cap 10.11.4). Chạy xattr -px …lệnh bạn đã đưa ra để hiển thị các thẻ trên một trong các thư mục của tôi sẽ cho đầu ra sau: "language:Objective-C\n2"(dòng mới) "platform:iOS\n4". Thành thật mà nói, nếu bạn sắp xếp mã shell phức tạp vừa phải của mình vào hàm bash, bạn sẽ chỉ nhân đôi nỗ lực của thẻ , có lợi thế là được cộng đồng duy trì tốt.
Slipp D. Thompson

@ SlippD.Thompson, làm thế nào được gói lên mã shell vào một chức năng bash bất cứ điều gì để làm với "nỗ lực nhân bản" của một công cụ để-được biên dịch? ... Bạn không cần phải đưa ra một phân tích ủng hộ con cho điều này và ' tag ', bạn chọn bất cứ thứ gì bạn thích. Tuyên bố của giải pháp này là bạn không cần một công cụ của bên thứ 3 để đạt được chức năng mong muốn.
Márton Sári
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.