Как установить метаданные «дата добавления» в 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), поэтому я не могу проверить это. Непроверенный код; сделайте резервную копию, прежде чем пытаться этот код!

Мой предыдущий ответ был основан на порядке сортировки, используемом стеком загрузок в Dock. Поле «Дата добавления» в 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.
Рори О'Кейн
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. Это то, что показывает столбец «Дата добавления» в представлении списка Finder.
Джон Сиракуза
Кстати, если вы хотите отобразить kMDItemDownloadedDate в виде информации о списках без использования HexFiend и TextWrangler, попробуйте xattr -p com.apple.metadata:kMDItemDownloadedDate FILENAME_HERE | xxd -r -p | plutil -convert xml1 - -o -. Xxd преобразует в двоичные данные plist, затем plutilпреобразует в XML plist и печатает их.
Мэтт Гибсон
Хорошо, я в голове, боюсь сказать. kMDItemDateAdded не указан в xattr -l, а kMDItemDownloadedDate не указан в mdls. Любопытнее и любопытнее. Также поле Дата добавления не хранится в xattr для каталога . Где живут эти метаданные?
Даниэль
1
Поскольку xattrэто скрипт на python, я полагаю, что в этом скрипте можно поэкспериментировать и выяснить, как получить двоичные данные атрибута в двоичном, а не в шестнадцатеричном виде, чтобы вы могли передавать его напрямую plutil.
Харальд Ханче-Олсен
4

Я не могу найти способ установить «Дата добавления», отображаемая в Finder.

Я считаю, что вы правы, что он получен из kMDItemDateAddedатрибута метаданных индекса Spotlight . Тем не менее, Spotlight, по-видимому, получает это сам по себе.

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

Я предположил бы , хотя я не уверен наверняка, что Центр внимания просто устанавливает эту дату, основанную на том, когда он в первый раз индексирует файл в определенном месте, и не проверяет другие метаданные для генерации. Если вы mvзагрузили файл из раздела «Загрузки» и вернулись обратно, Дата добавления обновится до момента его перемещения, но ни одна из метаданных файла не будет затронута, а только метаданные Spotlight.

Итак, в заключение, я считаю, что Date Added хранится только где-то в довольно загадочных кишках /.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, для настройки системы требуются права администратора. Таким образом, каждый вызов сценария оболочки должен следовать этой формуле:

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
Добро пожаловать, чтобы спросить другого! Вместо того , чтобы писать ответ на ответ редактировать чужой, просто нажмите изменить или улучшить этот ответ кнопку ниже поста , который вы хотите улучшить .
grg
Ответ Даниила был был отредактирован , чтобы включить эти изменения.
Рори О'Кейн,