Видны ли теги OSX Mavericks из командной строки?


13

Например, предположим, у меня есть структура каталогов, такая как

/Users
    /tlehman
        /Math
            algebraic_varieties.tex [tagged: Math, Documentation]
            projective_geometry.pdf [tagged: Math]
        /Development
            visualize_surfaces.py   [tagged: Math, Programming]
            solve_polynomials.scm   [tagged: Math]
    /guest
        /Desktop
            welcome.rtf             [tagged: Documentation]
/Volumes
    /USBKey
        assignments_for_may.txt     [tagged: Math]
        using_LaTeX.pdf             [tagged: Documentation]

Из командной строки можно ли использовать ls(или что-то в этом роде) способ отображения всех файлов, помеченных как «Math»?

РЕДАКТИРОВАТЬ: я сделал инструмент под названием, tfindкоторый делает это: https://github.com/tlehman/bin/blob/master/tfind



1
Я второй рекомендации для tagДжеймса Берри в https://github.com/jdberry. Вы можете установить его через brew install tag, добавить тег через tag -a <tag> <file>, найти теги через tag -f <tag1, tag2>. Очень, очень удобно, я использую это все время.
Крис Коновер

Да, безусловно, получить tagкоманду. Устанавливается с помощью Brew очень легко.
Джейкоб

Ответы:


11

Я предполагаю, что они будут xattr, как они в настоящее время на 10.8.3 (и старше)

В настоящее время вы можете просмотреть, с какими расширенными атрибутами имеет файл ls -l@.

Но чтобы увидеть содержимое атрибутов, вы должны использовать xattr.


Вы были правы, теги хранятся как
xattr

К вашему сведению: в OS X El Capitan я использовал команду xattr -pl com.apple.metadata:_kMDItemUserTags filename. Однако это был не очень дружелюбный выходной.
LS

13

Да, вы можете найти файлы с заданным пользовательским тегом mdfind.

Создайте файл и присвойте ему пользовательский тег в Finder.

Тогда иди в терминал; Вы найдете это с:

mdfind "kMDItemUserTags == Math || kMDItemUserTags == Programming"

или

mdfind "kMDItemUserTags == Math && kMDItemUserTags == Programming"

Смотрите также, -onlyin aFolderчтобы ограничить поиск.

Я не проверял, насколько сложными могут быть эти логические выражения, но эти два примера работают.

Вы можете передать вывод lsтак:

mdfind "kMDItemUserTags == mathTag || kMDItemUserTags == anotherTag" \
| while read f; do ls "$f"; md5 "$f"; done

Также у mdfind есть опция "-0"

    -0                Use NUL (``\0'') as a path separator, for use with xargs -0.

что может быть практичным с неприятными именами файлов.


Проблема этого метода в том, что он не находит все файлы, возвращая только (возможно, пустой) подмножество файлов.
markvgti

3
Оказывается , они ввели упрощенный mdfindсинтаксис для тегов, например: mdfind "tag:Math",mdfind "tag:Math OR tag:Programming"
wjv

1
@ AntoineLecaille У меня есть 295 файлов в каталоге с тегом «Orange» (ярлык Orange перед обновлением до Mavericks). Эта команда перечисляет только 11 из них. Также есть много файлов с тегом «Зеленый» --- эта команда не находит ни один из них.
markvgti

1
@wjv Я использовал предложенный вами синтаксис и получил те же результаты, что и перечисленные выше.
markvgti

1
@markvgti Затем возьмите один файл Orange, найденный с помощью этой команды, и файл, которого нет, и найдите различия с xattr или mdls?
Alecail

4

Вы можете получить все теги файла с помощью:

mdls -name kMDItemUserTags filename


Это, кажется, обратное тому, что спросили. Ваша команда сбрасывает все теги для одного файла. Я думаю, что ОП хочет знать все файлы с одним тегом.
Bmike

2
Тем не менее, полезно. Он отвечает на вопрос, который у меня был, когда я погуглил и оказался здесь. Если нет другой Q / A, которая покрывает это, возможно, стоит постараться опубликовать и ответить на него самостоятельно.
Слипп Д. Томпсон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.