As tags OSX Mavericks são visíveis na linha de comando?


13

Por exemplo, suponha que eu tenha uma estrutura de diretórios como

/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]

Na linha de comando, existe uma maneira de usar ls(ou algo parecido) para exibir todos os arquivos marcados como "Matemática"?

Edição: Eu fiz uma ferramenta chamada tfindque faz isso: https://github.com/tlehman/bin/blob/master/tfind



1
Eu segundo a recomendação de tagJames Berry em https://github.com/jdberry. Você pode instalá-lo via brew install tag, adicionar uma tag via tag -a <tag> <file>, encontrar tags via tag -f <tag1, tag2>. Muito, muito útil, eu uso o tempo todo.
precisa

Sim, definitivamente pegue o tagcomando. Instala via brew com muita facilidade.
Jacob

Respostas:


11

Estou assumindo que eles serão um xattr como eles estão atualmente no 10.8.3 (e mais antigos)

Atualmente, você pode visualizar com quais atributos estendidos um arquivo possui ls -l@.

Mas para ver o conteúdo dos atributos, você precisa usar xattr.


Você estava certo, as tags são armazenados como um xattr
tlehman

FYI: Com o OS X El Capitan, usei o comando xattr -pl com.apple.metadata:_kMDItemUserTags filename,. No entanto, não foi uma saída muito amigável.
LS

13

Sim, você pode encontrar arquivos que possuem uma determinada tag de usuário usando mdfind.

Crie um arquivo e atribua a ele uma tag personalizada no Finder.

Então entre em um terminal; você o encontrará com:

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

ou

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

Veja também -onlyin aFolderpara restringir a pesquisa.

Não verifiquei quão complexas essas expressões booleanas podem ser, mas esses dois exemplos funcionam.

Você pode canalizar a saída para o lsseguinte:

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

Além disso, o mdfind tem a opção "-0"

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

o que pode ser prático com nomes de arquivos desagradáveis.


O problema com esse método é que ele não encontra todos os arquivos, retornando apenas um subconjunto de arquivos (possivelmente vazio).
markvgti

3
Parece que eles já introduziu um simplificado mdfindsintaxe para tags, por exemplo: mdfind "tag:Math",mdfind "tag:Math OR tag:Programming"
wjv

1
@AntoineLecaille Eu tenho 295 arquivos em um diretório com a tag "Orange" (o rótulo laranja antes de atualizar para o Mavericks). Esse comando lista apenas 11 deles. Também possui muitos arquivos com a tag "Verde" - esse comando não encontra nenhum deles.
markvgti

1
@wjv Usei a sintaxe sugerida por você e obtive exatamente os mesmos resultados que listei acima.
markvgti

1
@markvgti Então pegue um arquivo Orange que é encontrado com este comando e outro que não é, e encontre as diferenças com xattr ou mdls?
alecail

4

Você pode obter todas as tags de um arquivo com:

mdls -name kMDItemUserTags filename


Parece ser o inverso do que foi perguntado. Seu comando despeja todas as tags para um arquivo. Eu acho que o OP quer conhecer todos os arquivos com uma tag.
bmike

2
Ainda assim, útil. Responde à pergunta que eu tinha quando pesquisei no Google e acabei aqui. Se não houver uma Q / A diferente que cubra isso, pode valer a pena o esforço de postar e responder uma.
precisa
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.