I tag OSX Mavericks sono visibili dalla riga di comando?


13

Ad esempio, supponiamo che io abbia una struttura di directory come

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

Dalla riga di comando, c'è un modo in cui posso usare ls(o qualcosa del genere) per visualizzare tutti i file contrassegnati come "Matematica"?

EDIT: ho creato uno strumento chiamato tfindche fa questo: https://github.com/tlehman/bin/blob/master/tfind



1
Secondo la raccomandazione tagdi James Berry a https://github.com/jdberry. Puoi installarlo tramite brew install tag, aggiungere un tag tramite tag -a <tag> <file>, trovare tag tramite tag -f <tag1, tag2>. Molto, molto utile, lo uso sempre.
Chris Conover,

Sì, ottieni sicuramente il tagcomando. Installa via brew molto facilmente.
Jacob,

Risposte:


11

Suppongo che saranno un xattr come sono attualmente su 10.8.3 (e precedenti)

Attualmente, puoi visualizzare gli attributi estesi con cui un file ha ls -l@.

Ma per vedere il contenuto degli attributi, devi usare xattr.


Avevi ragione, i tag sono memorizzati come xattr
tlehman il

FYI: Con OS X El Capitan, ho usato il comando, xattr -pl com.apple.metadata:_kMDItemUserTags filename. Tuttavia, non è stato un risultato molto amichevole.
LS

13

Sì, è possibile trovare file con un determinato tag utente utilizzando mdfind.

Crea un file e assegnagli un tag personalizzato nel Finder.

Quindi vai in un terminale; lo troverai con:

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

o

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

Vedi anche -onlyin aFolderper limitare la ricerca.

Non ho verificato quanto complesse possano essere queste espressioni booleane, ma questi due esempi funzionano.

È possibile reindirizzare l'output in lsquesto modo:

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

Inoltre, mdfind ha un'opzione "-0"

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

che può essere pratico con i nomi di file cattivi.


Il problema con questo metodo è che non trova tutti i file, restituendo solo un sottoinsieme (forse vuoto) di file.
markvgti,

3
Pare che hanno introdotto una semplificazione mdfinddella sintassi per i tag, ad esempio: mdfind "tag:Math",mdfind "tag:Math OR tag:Programming"
wjv

1
@AntoineLecaille Ho 295 file in una directory con il tag "Orange" (l'etichetta Orange prima di passare a Mavericks). Quel comando ne elenca solo 11. Inoltre hanno molti file taggati "Verde" --- quel comando non ne trova nessuno.
markvgti,

1
@wjv Ho usato la sintassi suggerita da te e ho ottenuto esattamente gli stessi risultati che ho elencato sopra.
markvgti,

1
@markvgti Quindi prendi un file Orange che si trova con questo comando e uno che non lo è, e trova le differenze con xattr o mdls?
alecail

4

Puoi ottenere tutti i tag di un file con:

mdls -name kMDItemUserTags filename


Questo sembra essere il contrario di ciò che è stato chiesto. Il tuo comando scarica tutti i tag per un file. Penso che l'OP voglia conoscere tutti i file con un tag.
bmike

2
Comunque utile. Risponde alla domanda che ho avuto quando ho cercato su Google e sono finito qui. Se non esiste un Q / A diverso che copre questo potrebbe valere la pena di postare e rispondere da soli.
Slipp D. Thompson,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.