Як встановити метадані "додано дату" в Mac OS X 10.7 Lion


22

Finder в Mac OS X 10.7 Lion показує новий фрагмент метаданих файлу "Дата додано", який відстежує дату, коли елемент був доданий до папки. Після оновлення до 10,7 жоден із елементів у моїй ~/Downloadsпапці не має значення "Дата додавання". Я хотів би встановити всі порожні значення "Дата додавання", щоб вони відповідали значенням "Дата зміни", але я не можу зрозуміти, як встановити атрибут "Дата додавання" на конкретне значення.

Моя перша здогадка:

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

Але це, здається, не працює (хоча і про помилку він не повідомляє).


Ви знайшли рішення?
erotsppa

1
Прийнята відповідь спрацювала, коли я спробував її (настільки ж божевільний).
Джон Сіракуза

Відповіді:


7

Добре, тут новий підхід. Увага: у мене немає системи, оновленої до Lion (на моєму комп'ютері встановлено Lion), тому я не можу перевірити це. Неперевірений код; створити резервну копію, перш ніж спробувати цей код!

Моя попередня відповідь ґрунтувалася на порядку сортування, використовуваному стеком завантажень у доці. Поле Додана дата у Finder базується на інформації Spotlight, яку важко зламати. Він також недоступний через AppleScript. Але, мабуть, існує рішення.

  1. Створіть новий робочий процес в Automator.

  2. Встановіть робочий процес на прийняття файлів або папок із Finder, додавши дію «Запитати елементи Finder».

  3. Попросіть робочий процес запустити AppleScript, додавши дію «Запустити AppleScript».

Використовуйте цей AppleScript:

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

Виберіть файли, у яких ще не додано дату (сортуйте за датою додавання у Finder, потім виберіть частину списку без дати додавання) та запустіть цю послугу.

скріншот робочого процесу в Automator


2
Це жахливо ... може, в хороший спосіб, можливо?
Джон Сіракуза

1
Ну, це напевно хак. Але здається, що конкретний фрагмент метаданих обчислюється з Spotlight, і без злому темної таємниці, відомої як /.Spotlight-V100, це може бути так добре, як це отримується. Але я люблю , щоб побачити чистий відповідь.
Даниїл

Я отримую дивну помилку від цього сценарію? sh: -c рядок 0: несподіваний EOF під час пошуку відповідності `"
erotsppa

@erotsppa це слід виправити та оновити зараз.
Даниїл

AppleScript зупинився з помилкою під час обробки файлу, який мав $його ім'я, але я обійшов цю проблему, тимчасово перейменувавши цей файл. Для того, щоб AppleScript обробляти такі файли, мої пошуки показують , що ви могли б замінити myfileз quoted form of myfile, але я не перевіряв це. Якщо хтось спробував це, може бути зрозуміліше зробити цитування під час встановлення myfileта перейменування змінної у quotedFilePath.
Rory O'Kane

7

Коли я запускаю xattr -lелементи в папці "Завантаження", я отримую поле, яке виглядає приблизно так:

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

Це бінарний пліст. Коли я використовую HexFiend для створення файлу з тими байтами (так, я вручив їх вручну; вибух з минулого, наприклад, введення коду асемблера з журналу в мій Apple] [GS), а потім зберегти його як файл .plist, я відкрив файл у TextWrangler і отримав наступний некомпільований xml:

<?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>

Це говорить, хоча Apple, схоже, зберігає дати у складеному XML, звичайний текст, здається, працює.

Іншими словами, якщо ви можете отримати модифіковану дату файлу у рядковій формі, ви можете запустити команду xattr -w com.apple.metadata:kMDItemDownloadedDate "2012-02-19 16:34:47 +0000" fileзмінити "завантажену дату", яка, як видається, є полем, фактично відсортованим, а не фактично доданою датою.

Зрештою, ви не помилилися під час додавання (невикористаного) kMDItemDateAddedполя, оскільки, як я дізнався у цій статті , з xattrрадістю встановить усі потрібні, використані чи невикористані поля метаданих.

У цьому і полягає суть відповіді. Я буду працювати над написанням AppleScript, щоб отримати модифіковану дату для кожного файлу, перевірити, чи kMDItemDownloadedDateвстановлено, а якщо ні, встановіть kMDItemDownloadedDate на модифіковану дату, але я хотів, щоб ядро ​​відповіді було опубліковано.


1
Запустіть mdls у файлах у папці завантажень, і ви побачите значення kMDItemDateAdded. Ось що показує стовпчик "Дата додавання" у вікні "Список списку шукачів".
Джон Сіракуза

До речі, якщо ви хочете показати kMDItemDownloadedDate як інформацію плісту, не проходячи через HexFiend та TextWrangler, спробуйте xattr -p com.apple.metadata:kMDItemDownloadedDate FILENAME_HERE | xxd -r -p | plutil -convert xml1 - -o -. Xxd перетворює у двійкові дані плістів, потім plutilперетворює у XML-пліст та друкує їх.
Метт Гібсон

Гаразд, у мене над головою, боюся сказати. kMDItemDateAdded не вказано в xattr -l, а kMDItemDownloadedDate не вказано у mdls. Curiouser і curiouser. Поле Додана дата не зберігається в xattr для каталогу . Де живуть ці метадані?
Даниїл

1
Оскільки xattrце сценарій python, я думаю, що в цьому сценарії повинно бути можливим розібратися і зрозуміти, як отримати бінарні дані атрибуту у двійковій формі, а не в шістнадцятковій формі, щоб ви могли подати його безпосередньо plutil.
Харальд Ханш-Олсен

4

Я не можу знайти спосіб встановити "Дата додавання", показану в Finder.

Я вважаю, що ви правильні, що це отримано з kMDItemDateAddedатрибута метаданих індексу Spotlight . Однак, як видається, прожектор певним чином це сприймає.

Я спробував налаштувати розширений атрибут файлу, який викликається com.apple.metadata:kMDItemDateAddedзначенням дати, в одному з декількох різних форматів, включаючи формат, який використовується, kMDItemDateAddedі жоден з них не був підібраний індексом Spotlight, тобто незалежно від того, яке значення відображається xattr, значення показаний mdlsне змінився

Я б здогадався , хоча я не знаю напевно, що Spotlight просто встановлює цю дату на основі першого разу, коли вона індексує файл у певному місці, і не перевіряє жодних інших метаданих з метою їх генерування. Якщо ви завантажили mvфайл із файлів "Завантаження" та "назад", додана дата додається до оновлення, коли він був перенесений назад, але жоден з метаданих файлів не впливає, лише метадані Spotlight.

Отже, підводячи підсумок, я вважаю, що додана дата зберігається лише десь у досить криптованій кишці /.Spotlight-V100, і якщо хтось не може придумати спосіб сповіщення Spotlight, щоб оновити запис метаданих до довільного значення, я можу ' я не бачу способу цього зробити.


Прожектор! Молодці.
Даниїл

4

Дякую Даніелю Лоусону за рішення! Це все ще працює добре навіть через два роки.

У мене є два доповнення:

1) Зауважте, що в коді прийнятої відповіді є невелика помилка.

Цей рядок:

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

... має додатковий апостроф, викликаючи помилку "несподіваного EOF". Він повинен читати:

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

2) Більш важливо, починаючи з Mavericks 10.9.2, система settup вимагає прав адміністратора. Тому кожен виклик скрипту оболонки повинен відповідати цій формулі:

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

Ось повна модифікована версія AppleScript, підтверджена для роботи в 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

1
Ласкаво просимо до "Запитайте різних"! Замість того , щоб писати відповідь на відповідь редагувати чужий, просто натисніть змінити або поліпшити цю відповідь кнопку нижче поста , який ви хочете поліпшити .
гр

Відповідь Данила був був відредагований , щоб включити ці зміни.
Rory O'Kane
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.