Apakah tag OSX Mavericks terlihat dari baris perintah?

13

Sebagai contoh, misalkan saya memiliki struktur direktori seperti

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

Dari baris perintah, apakah ada cara saya dapat menggunakan ls(atau sesuatu seperti itu) untuk menampilkan semua file yang ditandai sebagai "Matematika"?

EDIT: Saya membuat alat bernama tfindyang melakukan ini: https://github.com/tlehman/bin/blob/master/tfind

tlehman
sumber
2
Lihat github.com/jdberry/tag
mankoff
1
Saya kedua rekomendasi untuk tagoleh James Berry di https://github.com/jdberry. Anda dapat menginstalnya melalui brew install tag, menambahkan tag melalui tag -a <tag> <file>, mencari tag via tag -f <tag1, tag2>. Sangat, sangat berguna, saya menggunakannya setiap saat.
Chris Conover
Ya, pasti dapatkan tagperintahnya. Menginstal melalui minuman sangat mudah.
Yakub

Jawaban:

11

Saya berasumsi mereka akan menjadi xattr seperti saat ini di 10.8.3 (dan lebih lama)

Saat ini, Anda dapat melihat atribut diperluas yang dimiliki file ls -l@.

Tetapi untuk melihat isi dari atribut, Anda harus menggunakan xattr.

pendiam
sumber
Anda benar, tag disimpan sebagai xattr
tlehman
FYI: Dengan OS X El Capitan, saya menggunakan perintah xattr -pl com.apple.metadata:_kMDItemUserTags filename,. Namun, itu bukan keluaran yang sangat ramah.
LS
13

Ya, Anda dapat menemukan file yang menggunakan tag pengguna tertentu mdfind.

Buat file dan tetapkan sebagai tag khusus di Finder.

Lalu pergi di terminal; Anda akan menemukannya dengan:

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

atau

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

Lihat juga -onlyin aFolderuntuk membatasi pencarian.

Saya tidak memeriksa seberapa kompleks ekspresi boolean ini, tetapi dua contoh ini berfungsi.

Anda dapat menyalurkan output ke lsseperti ini:

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

Juga, mdfind memiliki opsi "-0"

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

yang bisa praktis dengan nama file jahat.

alecail
sumber
Masalah dengan metode ini adalah tidak menemukan semua file, hanya mengembalikan sub-set file (mungkin kosong).
markvgti
3
Tampaknya mereka telah memperkenalkan disederhanakan mdfindsintaks untuk tag, misalnya: mdfind "tag:Math",mdfind "tag:Math OR tag:Programming"
WJV
1
@AntoineLecaille Saya memiliki 295 file di direktori dengan tag "Oranye" (Label Oranye sebelum meningkatkan ke Mavericks). Perintah itu hanya mencantumkan 11 di antaranya. Juga memiliki banyak file yang ditandai "Hijau" --- perintah itu tidak menemukan satu pun dari mereka.
markvgti
1
@ wjv Saya menggunakan sintaks yang disarankan oleh Anda dan mendapatkan hasil yang persis sama dengan yang saya sebutkan di atas.
markvgti
1
@markvgti Kemudian ambil satu file Orange yang ditemukan dengan perintah ini dan yang tidak, dan temukan perbedaannya dengan xattr atau mdls?
alecail
4

Anda bisa mendapatkan semua tag file dengan:

mdls -name kMDItemUserTags filename

Christian A. Strømmen
sumber
Ini tampaknya kebalikan dari apa yang diminta. Perintah Anda membuang semua tag untuk satu file. Saya pikir OP ingin tahu semua file dengan satu tag.
bmike
2
Tetap saja bermanfaat. Itu menjawab pertanyaan yang saya miliki ketika saya mencari di Google dan berakhir di sini. Jika tidak ada Q / A yang berbeda yang membahas hal ini, mungkin perlu upaya untuk mengirim dan menjawabnya sendiri.
Slipp D. Thompson