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



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.


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.


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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.