터미널을 통해 폴더에 태그를 지정할 수 있습니까?


11

터미널 명령을 통해 매버릭스에서 파일 또는 폴더에 태그를 지정할 수 있습니까?


1
그렇습니다. 태그는 xattr을 사용하여 저장 / 읽고 com.apple.metadata : _kMDItemUserTags에 저장됩니다. 좀 더 구체적인 질문으로 편집하고 싶습니까 (아마도 파이썬을 사용하여 "foo"라는 태그를 특정 파일에 쉽게 설정 하시겠습니까) 또는 기술적으로 가능한지 궁금하십니까?
bmike

관련 질문은 여기
Asmus

1
@ bmike 감사합니다, 그래 프로그래밍 방식으로 편집하고 싶습니다 : P
GedankenNebel

답변:


23

xattr을 사용할 수 있습니다. 그러면 태그가 file1에서 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

태그는 속성 목록에 단일 문자열 배열로 저장됩니다.

$ 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의 kColor 플래그가 설정되어 있지 않으면 Finder는 색상의 원을 표시하지 않습니다. kColor 플래그가 주황색으로 설정되어 있고 파일에 빨간색 태그가 있으면 Finder는 빨간색과 주황색 원을 모두 표시합니다. AppleScript로 kColor 플래그를 설정할 수 있습니다.

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 플래그에 사용 된 비트 값을 인쇄합니다. 빨간색은 C, 주황색은 E, 노란색은 A, 녹색은 4, 파란색은 8, 자홍색은 6, 회색은 2입니다. 값에 1을 더하는 플래그는 OS X에서 사용되지 않습니다.

편집 : 당신은 또한 태그 를 사용할 수 있습니다 :

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)

태그는 brew install tag또는 로 설치할 수 있습니다 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

순수 bash 명령을 통해 태그를 조작 할 수 있습니다. 타사 "태그"유틸리티가 필요하지 않습니다.

이 명령은 파일의 모든 태그 ($ src)를 나열합니다.

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

다음은 파일 ($ src)에 태그 ($ newtag)를 추가하는 방법입니다.

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"

다음은 "태그"함수를 내보내는 작은 쉘 스크립트입니다. 용법:

tags <file>
Lists all tags of a file

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

기능을 쉽게 확장하여 제거도 지원할 수 있습니다.

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

이케, 긴 줄이야! 래핑 편집을 제안했습니다. 그래도 작은 셸 스크립트로 더 잘 수행 될 수 있다고 생각합니다.
zigg

귀하의 xattr -wx파일이 이미 거기에 어떤 태그가없는 경우 명령이 실패합니다. 어떻게 피할 수 있습니까?
user3932000

최신 OS X (El Cap 10.11.4)에 문제가있는 것 같습니다. xattr -px …내 폴더 중 하나에 태그를 표시하기 위해 제공 한 명령을 실행하면 "language:Objective-C\n2"(newline) 출력이 제공 "platform:iOS\n4"됩니다. 솔직히, 약간 복잡한 쉘 코드를 bash 함수로 마무리하려는 경우, 태그 의 노력을 복제하는 것만 으로도 커뮤니티를 잘 유지 관리 할 수 ​​있다는 이점이 있습니다.
Slipp D. Thompson

@ SlippD.Thompson는 떠들썩한 기능에 쉘 코드를 마무리하는 방법을 무엇이든 A를-수 컴파일 도구의 "노력의 중복 '과는? ... 당신이와'에 대한 프로 사기꾼 분석을 제공 할 필요가 없습니다 태그 ', 원하는 것을 선택하십시오. 이 솔루션의 설명은 원하는 기능을 달성하기 위해 타사 도구가 필요하지 않다는 것입니다.
Márton Sári
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.