Cara mengatur metadata "tanggal ditambahkan" di Mac OS X 10.7 Lion

22

Finder di Mac OS X 10.7 Lion menunjukkan potongan metadata file baru, "Date Added," yang melacak tanggal item ditambahkan ke folder. Setelah memutakhirkan ke 10.7, tidak ada item di ~/Downloadsfolder saya yang memiliki nilai "Tanggal Ditambahkan". Saya ingin menetapkan semua nilai "Tanggal Tambah" kosong agar cocok dengan nilai "Tanggal Dimodifikasi", tetapi saya tidak tahu cara mengatur atribut "Tanggal ditambahkan" ke nilai tertentu.

Tebakan pertama saya adalah ini:

xattr -w com.apple.metadata:kMDItemDateAdded "2012-02-19 16:34:47 +0000" myfile

Tapi itu sepertinya tidak berhasil (meskipun tidak melaporkan kesalahan juga).

John Siracusa
sumber
Apakah Anda akhirnya menemukan solusi?
erotsppa
1
Jawaban yang diterima bekerja ketika saya mencobanya (gila seperti itu).
John Siracusa

Jawaban:

7

Oke, pendekatan baru di sini. Perhatian: Saya tidak memiliki sistem yang ditingkatkan ke Lion (komputer saya dilengkapi dengan Lion yang diinstal) jadi saya tidak dapat menguji ini. Kode yang belum diuji; cadangkan sebelum mencoba kode ini!

Jawaban saya sebelumnya didasarkan pada urutan pengurutan yang digunakan oleh tumpukan Unduhan di Dock. Bidang Tanggal Ditambahkan dalam Finder tampaknya didasarkan pada informasi Spotlight, yang sulit diretas. Itu juga tidak dapat diakses melalui AppleScript. Tapi, sepertinya ada solusi.

  1. Buat Workflow baru di Automator.

  2. Tetapkan alur kerja untuk menerima file atau folder dari Finder dengan menambahkan tindakan "Tanya item Finder".

  3. Mintalah alur kerja menjalankan AppleScript dengan menambahkan tindakan "Jalankan AppleScript".

Gunakan AppleScript ini:

on run {input, parameters}
    do shell script "sudo /usr/sbin/systemsetup -setusingnetworktime Off" with administrator privileges
    tell application "Finder"
        repeat with x in input
            set myfile to POSIX path of x
            set nm to name of x
            set d to modification date of x
            set yr to (character 3 of (year of d as string)) & (character 4 of (year of d as string))
            set mth to (month of d as number) as string
            if length of mth is 1 then set mth to "0" & mth
            set dy to day of d as string
            if length of dy is 1 then set dy to "0" & dy
            set h to hours of d as string
            if length of h is 1 then set h to "0" & h
            set m to minutes of d as string
            if length of m is 1 then set m to "0" & m
            set s to seconds of d as string
            if length of s is 1 then set s to "0" & s
            set dt to mth & ":" & dy & ":" & yr as string
            set tm to h & ":" & m & ":" & s as string
            do shell script "sudo /usr/sbin/systemsetup -setdate '" & dt & "'" with administrator privileges
            do shell script "sudo /usr/sbin/systemsetup -settime '" & tm & "'" with administrator privileges
            do shell script "mv \"" & myfile & "\" /var/tmp/clobber"
            do shell script "mv /var/tmp/clobber \"" & myfile & "\""
        end repeat
    end tell
    do shell script "sudo /usr/sbin/systemsetup -setusingnetworktime On" with administrator privileges
    return input
end run

Pilih file yang belum memiliki Date Added (urutkan berdasarkan Date Added di Finder, lalu pilih bagian dari daftar tanpa Date Added) dan jalankan layanan ini.

tangkapan layar alur kerja di Automator

Daniel
sumber
2
Itu mengerikan ... dengan cara yang baik, mungkin?
John Siracusa
1
Yah, itu pasti hack. Tetapi tampaknya sepotong metadata tertentu dihitung dari Spotlight, dan tanpa meretas misteri kelam yang dikenal /.Spotlight-V100, ini mungkin sama baiknya dengan yang didapat. Tapi aku senang melihat jawaban bersih.
Daniel
Saya mendapat kesalahan aneh dari skrip ini? sh: -c baris 0: EOF yang tak terduga sambil mencari yang cocok `"
erotsppa
@ erotsppa itu harus diperbaiki dan diperbarui sekarang.
Daniel
AppleScript berhenti dengan kesalahan ketika memproses file yang memiliki $namanya, tapi saya mengatasinya dengan mengganti nama sementara file itu. Untuk membuat AppleScript menangani file seperti itu, pencarian saya menunjukkan bahwa Anda dapat menggantinya myfiledengan quoted form of myfile, tetapi saya belum mengujinya. Jika seseorang mencobanya, mungkin akan lebih jelas untuk melakukan penawaran ketika mengatur myfiledan mengganti nama variabel menjadi quotedFilePath.
Rory O'Kane
7

Ketika saya menjalankan xattr -litem di folder Unduhan saya, saya mendapatkan bidang yang terlihat seperti ini:

com.apple.metadata:kMDItemDownloadedDate:
00000000  62 70 6C 69 73 74 30 30 A1 01 33 41 B4 83 4D BF  |bplist00..3A..M.|
00000010  4C 4F E3 08 0A 00 00 00 00 00 00 01 01 00 00 00  |LO..............|
00000020  00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 13                                   |.....|
00000035

Ini adalah plist biner. Ketika saya menggunakan HexFiend untuk membuat file dengan byte tersebut (ya, saya secara manual memasukkannya; hast dari masa lalu seperti memasukkan kode assembler dari majalah ke Apple saya] [GS), lalu simpan sebagai file .plist, saya membuka file di TextWrangler dan mendapat xml terkompilasi berikut:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <date>2011-11-28T05:03:59Z</date>
</array>
</plist>

Yang mengatakan, sementara Apple tampaknya menyimpan tanggal dalam XML yang dikompilasi, teks biasa tampaknya berfungsi.

Dengan kata lain, jika Anda bisa mendapatkan tanggal modifikasi file dalam bentuk string, Anda dapat menjalankan perintah xattr -w com.apple.metadata:kMDItemDownloadedDate "2012-02-19 16:34:47 +0000" fileuntuk mengubah "tanggal yang diunduh", yang tampaknya merupakan bidang yang benar-benar disortir, bukan Tanggal aktual yang ditambahkan.

Akhirnya Anda tidak mendapatkan kesalahan saat menambahkan bidang (tidak digunakan) kMDItemDateAddedkarena, seperti yang saya pelajari di artikel ini , xattrakan dengan senang hati mengatur bidang metadata apa pun yang Anda inginkan, digunakan atau tidak digunakan.

Itulah inti dari jawabannya. Saya akan bekerja menulis AppleScript untuk mendapatkan tanggal yang dimodifikasi untuk setiap file, periksa untuk melihat apakah kMDItemDownloadedDatesudah diatur, dan jika tidak, atur kMDItemDownloadedDate ke tanggal modifikasi, tetapi saya ingin mendapatkan inti dari jawaban yang diposting.

Daniel
sumber
1
Jalankan mdl pada file di folder Unduhan Anda dan Anda akan melihat nilai kMDItemDateAdded. Itulah yang ditampilkan kolom "Tanggal Tambah" di tampilan Daftar Penemu.
John Siracusa
Kebetulan, jika Anda ingin memperlihatkan kMDItemDownloadedDate sebagai informasi daftar tanpa melalui HexFiend dan TextWrangler, coba xattr -p com.apple.metadata:kMDItemDownloadedDate FILENAME_HERE | xxd -r -p | plutil -convert xml1 - -o -. Xxd mengkonversi ke data binary plist, kemudian plutilmengkonversi ke XML plist dan mencetaknya.
Matt Gibson
OK, saya di atas kepala saya, saya takut untuk mengatakan. kMDItemDateAdded tidak terdaftar xattr -l, dan kMDItemDownloadedDate tidak terdaftar mdls. Ingin tahu dan ingin tahu. Field Date Added tidak disimpan dalam xattr untuk direktori . Di mana metadata ini tinggal?
Daniel
1
Karena xattrini adalah skrip python, saya kira itu mungkin untuk melihat-lihat dalam skrip ini dan mencari cara untuk mendapatkan data biner dari atribut dalam biner, bukan hex, sehingga Anda dapat memberinya makan secara langsung plutil.
Harald Hanche-Olsen
4

Saya tidak dapat menemukan cara untuk mengatur "Tanggal Ditambahkan" yang ditampilkan di Finder.

Saya yakin Anda benar bahwa itu diambil dari kMDItemDateAddedatribut metadata indeks Spotlight . Namun, Spotlight tampaknya menurunkan ini sendiri dalam beberapa cara.

Saya sudah mencoba menyiapkan atribut file diperluas yang dipanggil com.apple.metadata:kMDItemDateAddedke nilai tanggal dalam salah satu dari beberapa format yang berbeda, termasuk format yang digunakan oleh kMDItemDateAddeddan tidak ada yang diambil oleh indeks Spotlight, yaitu tidak peduli berapa nilainya ditunjukkan oleh xattr, nilainya ditunjukkan oleh mdlstidak diubah.

Saya akan menebak , meskipun saya tidak tahu pasti, bahwa Spotlight hanya menetapkan tanggal ini berdasarkan pertama kali indeks file di lokasi tertentu, dan tidak memeriksa metadata lain untuk menghasilkannya. Jika Anda mvsebuah file dari Unduhan dan kembali, Tanggal Ditambahkan memperbarui ketika itu dipindahkan kembali, tetapi tidak ada satu pun metadata file yang terpengaruh, hanya metadata Spotlight.

Jadi, secara ringkas, saya rasa Date Added hanya disimpan di suatu tempat di nyali /.Spotlight-V100 yang agak samar, dan kecuali seseorang dapat menemukan cara memberitahu Spotlight untuk memperbarui entri metadata ke nilai sewenang-wenang, saya bisa ' t melihat cara melakukan ini.

Matt Gibson
sumber
Menyoroti! Sudah selesai dilakukan dengan baik.
Daniel
4

Terima kasih kepada Daniel Lawson untuk solusinya! Itu masih bekerja dengan baik, bahkan dua tahun kemudian.

Saya memiliki dua tambahan:

1) Harap dicatat bahwa ada kesalahan kecil dalam kode jawaban yang diterima.

Garis ini:

do shell script "/usr/sbin/systemsetup -settime ''" & tm & "'"

... memiliki apostrof tambahan, memicu kesalahan "EOF yang tidak terduga". Itu harus membaca:

do shell script "/usr/sbin/systemsetup -settime '" & tm & "'"

2) Lebih penting, dimulai dengan Mavericks 10.9.2, pengaturan sistem membutuhkan hak administrator. Jadi setiap skrip panggilan ke shell harus mengikuti rumus ini:

do shell script "sudo /usr/sbin/systemsetup -setusingnetworktime Off" with administrator privileges

Inilah versi AppleScript yang dimodifikasi penuh, yang dikonfirmasikan berfungsi di 10.9.3:

on run {input, parameters}
    do shell script "sudo /usr/sbin/systemsetup -setusingnetworktime Off" with administrator privileges

    tell application "Finder"
        repeat with x in input
            set myfile to POSIX path of x
            set nm to name of x

            set d to modification date of x
            set yr to (character 3 of (year of d as string)) & (character 4 of (year of d as string))
            set mth to (month of d as number) as string
            if length of mth is 1 then set mth to "0" & mth
            set dy to day of d as string
            if length of dy is 1 then set dy to "0" & dy
            set h to hours of d as string
            if length of h is 1 then set h to "0" & h
            set m to minutes of d as string
            if length of m is 1 then set m to "0" & m
            set s to seconds of d as string
            if length of s is 1 then set s to "0" & s

            set dt to mth & ":" & dy & ":" & yr as string
            set tm to h & ":" & m & ":" & s as string
            do shell script "sudo /usr/sbin/systemsetup -setdate '" & dt & "'" with administrator privileges
            do shell script "sudo /usr/sbin/systemsetup -settime '" & tm & "'" with administrator privileges

            do shell script "mv \"" & myfile & "\" /var/tmp/clobber"
            do shell script "mv /var/tmp/clobber \"" & myfile & "\""
        end repeat
    end tell

    do shell script "sudo /usr/sbin/systemsetup -setusingnetworktime On" with administrator privileges

    return input
end run
John Keller
sumber
1
Selamat Datang di Tanya Berbeda! Alih-alih menulis jawaban untuk mengedit jawaban orang lain, cukup klik edit atau tingkatkan tombol jawaban di bawah pos yang ingin Anda tingkatkan .
grg
Jawaban Daniel telah diedit untuk memasukkan perubahan ini.
Rory O'Kane