¿Son visibles las etiquetas OSX Mavericks desde la línea de comandos?

13

Por ejemplo, supongamos que tengo una estructura de directorio 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]

Desde la línea de comandos, ¿hay alguna forma en que pueda usar ls(o algo así) para mostrar todos los archivos etiquetados como "Matemáticas"?

EDITAR: Hice una herramienta llamada tfindque hace esto: https://github.com/tlehman/bin/blob/master/tfind

tlehman
fuente
2
Ver github.com/jdberry/tag
mankoff
1
Secundo la recomendación de tagJames Berry en https://github.com/jdberry. Puede instalarlo vía brew install tag, agregar una etiqueta vía tag -a <tag> <file>, buscar etiquetas vía tag -f <tag1, tag2>. Muy, muy útil, lo uso todo el tiempo.
Chris Conover
Sí, definitivamente obtén el tagcomando. Se instala a través de brew muy fácilmente.
Jacob

Respuestas:

11

Supongo que serán un xattr como están actualmente en 10.8.3 (y anteriores)

Actualmente, puede ver qué atributos extendidos tiene un archivo ls -l@.

Pero para ver el contenido de los atributos, debe usar xattr.

recatado
fuente
Tenías razón, las etiquetas se almacenan como un xattr
tlehman
FYI: Con OS X El Capitán, he utilizado el comando, xattr -pl com.apple.metadata:_kMDItemUserTags filename. Sin embargo, no fue una salida muy amigable.
LS
13

Sí, puede encontrar archivos que tengan una etiqueta de usuario determinada usando mdfind.

Cree un archivo y asígnele una etiqueta personalizada en Finder.

Luego entra en una terminal; lo encontrarás con:

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

o

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

Consulte también -onlyin aFolderpara restringir la búsqueda.

No comprobé cuán complejas pueden ser estas expresiones booleanas, pero estos dos ejemplos funcionan.

Puede canalizar la salida de lsesta manera:

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

Además, mdfind tiene una opción "-0"

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

que puede ser práctico con nombres de archivo desagradables.

alecail
fuente
El problema con este método es que no encuentra todos los archivos, devolviendo solo un subconjunto (posiblemente vacío) de archivos.
markvgti
3
Parece que hemos introducido una simplificado mdfindsintaxis de las etiquetas, por ejemplo: mdfind "tag:Math",mdfind "tag:Math OR tag:Programming"
WJV
1
@AntoineLecaille Tengo 295 archivos en un directorio con la etiqueta "Naranja" (la Etiqueta Naranja antes de actualizar a Mavericks). Ese comando enumera solo 11 de ellos. También tenga muchos archivos etiquetados como "Verde", ese comando no encuentra ninguno de ellos.
markvgti
1
@wjv Usé la sintaxis sugerida por usted y obtuve exactamente los mismos resultados que enumeré anteriormente.
markvgti
1
@markvgti Luego, tome un archivo Orange que se encuentre con este comando y otro que no, y encuentre las diferencias con xattr o mdls?
alecail
4

Puede obtener todas las etiquetas de un archivo con:

mdls -name kMDItemUserTags filename

Christian A. Strømmen
fuente
Esto parece ser lo contrario de lo que se le preguntó. Su comando volca todas las etiquetas para un archivo. Creo que el OP quiere saber todos los archivos con una etiqueta.
bmike
2
Aún así, útil. Responde a la pregunta que tenía cuando busqué en Google y terminé aquí. Si no hay un Q / A diferente que cubra esto, podría valer la pena publicar y responder uno usted mismo.
Slipp D. Thompson