Jak ustawić metadane „data dodania” w Mac OS X 10.7 Lion

22

Finder w Mac OS X 10.7 Lion pokazuje nowy fragment metadanych pliku „Data dodania”, który śledzi datę dodania elementu do folderu. Po uaktualnieniu do wersji 10.7 żaden element w moim ~/Downloadsfolderze nie ma wartości „Data dodania”. Chciałbym ustawić wszystkie puste wartości „Data dodania”, aby pasowały do ​​wartości „Data modyfikacji”, ale nie mogę ustalić, jak ustawić atrybut „Data dodania” na określoną wartość.

Moje pierwsze przypuszczenie było następujące:

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

Ale to nie wydaje się działać (choć nie zgłasza też błędu).

John Siracusa
źródło
Czy znalazłeś rozwiązanie?
erotsppa
1
Akceptowana odpowiedź zadziałała, gdy ją wypróbowałem (jakkolwiek szalona jest).
John Siracusa

Odpowiedzi:

7

OK, nowe podejście tutaj. Przestroga: Nie mam uaktualnienia systemu do Lion (mój komputer został dostarczony z zainstalowanym Lion), więc nie mogę tego przetestować. Nieprzetestowany kod; wykonaj kopię zapasową przed wypróbowaniem tego kodu!

Moja poprzednia odpowiedź była oparta na kolejności sortowania stosowanej przez stos Pobrane w Docku. Wydaje się, że pole Data dodania w Finderze opiera się na informacjach w centrum uwagi, które trudno jest zhakować. Nie jest również dostępny za pośrednictwem AppleScript. Ale wydaje się, że istnieje obejście tego problemu.

  1. Utwórz nowy przepływ pracy w Automatorze.

  2. Ustaw przepływ pracy, aby akceptować pliki lub foldery z Findera, dodając akcję „Zapytaj o elementy Findera”.

  3. Poproś, aby przepływ pracy uruchomił AppleScript, dodając akcję „Uruchom AppleScript”.

Użyj tego 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

Wybierz pliki, które nie mają jeszcze daty dodania (sortuj według daty dodania w Finderze, a następnie wybierz część listy bez daty dodania) i uruchom tę usługę.

zrzut ekranu przepływu pracy w Automatorze

Daniel
źródło
2
To okropne… może w dobrym sensie?
John Siracusa,
1
To zdecydowanie hack. Wygląda jednak na to, że określony fragment metadanych jest obliczany ze Spotlight i bez włamania się do mrocznej tajemnicy znanej jako /.Spotlight-V100, może być tak dobry, jak to tylko możliwe. Ale ja kocham zobaczyć czystą odpowiedź.
Daniel
Mam dziwny błąd z tego skryptu? sh: -c linia 0: nieoczekiwany EOF podczas wyszukiwania pasującego „”
erotsppa
@erotsppa należy to teraz poprawić i zaktualizować.
Daniel
AppleScript zatrzymał się z błędem podczas przetwarzania pliku, który miał $w nazwie, ale obejrzałem go, tymczasowo zmieniając nazwę tego pliku. Aby AppleScript obsługiwać takie pliki, moje pytania wskazują, że można zastąpić myfilez quoted form of myfile, ale nie testowałem tego. Jeśli ktoś spróbuje tego, łatwiejsze będzie cytowanie przy ustawianiu myfilei zmianie nazwy zmiennej na quotedFilePath.
Rory O'Kane
7

Kiedy uruchamiam xattr -lelementy w folderze Pobrane, otrzymuję pole, które wygląda mniej więcej tak:

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

To jest plista binarna. Kiedy używam HexFiend do tworzenia pliku z tymi bajtami (tak, ręcznie je wprowadziłem; wybuch z przeszłości, jak wprowadzanie kodu asemblera z magazynu do mojego Apple] [GS), a następnie zapisz go jako plik .plist, otworzyłem plik w TextWrangler i otrzymałem następujący nieskompilowany plik 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>

To powiedziawszy, podczas gdy Apple wydaje się przechowywać daty w skompilowanym XML, zwykły tekst wydaje się działać.

Innymi słowy, jeśli możesz uzyskać datę modyfikacji pliku w postaci ciągu, możesz uruchomić polecenie xattr -w com.apple.metadata:kMDItemDownloadedDate "2012-02-19 16:34:47 +0000" filezmiany „daty pobrania”, która wydaje się być polem faktycznie posortowanym, a nie faktyczną datą dodania.

W końcu nie wystąpił błąd podczas dodawania (nieużywanego) kMDItemDateAddedpola, ponieważ, jak dowiedziałem się w tym artykule , xattrz przyjemnością ustawię dowolne pole metadanych, które chcesz, będzie używane lub nieużywane.

To jest sedno odpowiedzi. Będę pracować nad napisaniem AppleScript, aby uzyskać zmodyfikowaną datę dla każdego pliku, sprawdź, czy kMDItemDownloadedDatejest ustawiony, a jeśli nie, ustaw kMDItemDownloadedDate na zmodyfikowaną datę, ale chciałem opublikować rdzeń odpowiedzi.

Daniel
źródło
1
Uruchom mdls na plikach w folderze Pobrane, a zobaczysz wartości kMDItemDateAdded. Tak pokazuje kolumna „Data dodania” w widoku listy Findera.
John Siracusa
Nawiasem mówiąc, jeśli chcesz pokazać kMDItemDownloadedDate jako informację plist bez przechodzenia przez HexFiend i TextWrangler, spróbuj xattr -p com.apple.metadata:kMDItemDownloadedDate FILENAME_HERE | xxd -r -p | plutil -convert xml1 - -o -. Nawróceni xxd do binarnych danych plist, potem plutilkonwertuje do plist XML i drukuje to.
Matt Gibson,
OK, jestem nad głową, boję się powiedzieć. kMDItemDateAdded nie ma na liście xattr -l, a kMDItemDownloadedDate nie ma na liście mdls. Curiouser i curiouser. Również pole Data dodania nie jest przechowywane w xattr dla katalogu . Gdzie żyją te metadane?
Daniel
1
Ponieważ xattrjest to skrypt Pythona, myślę, że powinna istnieć możliwość przejrzenia tego skryptu i wymyślenia, w jaki sposób uzyskać dane binarne atrybutu w postaci binarnej, a nie szesnastkowej, aby można było je natychmiast karmić plutil.
Harald Hanche-Olsen
4

Nie mogę znaleźć sposobu, aby ustawić „Data dodania” wyświetlaną w Finderze.

Wierzę, że jesteś prawdą, że jest to pobierane z indeksu Spotlight za kMDItemDateAddedatrybut metadanych. Jednak wydaje się, że Spotlight w jakiś sposób czerpie to z siebie.

Próbowałem skonfigurować rozszerzony atrybut pliku wywoływany com.apple.metadata:kMDItemDateAddeddo wartości daty w jednym z kilku różnych formatów, w tym w formacie używanym przez kMDItemDateAddedi żaden z nich nie został wykryty przez indeks Spotlight, tj. Bez względu na wartość pokazywaną przez xattrwartość pokazane przez mdlsnie zostało zmienione.

Chciałbym odgadnąć , choć nie wiem na pewno, że Spotlight prostu ustawia tę datę w oparciu o raz pierwszy spis plik w określonej lokalizacji, a nie sprawdza żadnych innych metadanych w celu jej wytworzenia. Jeśli masz mvplik z Pobranych i włączyłeś go ponownie, data dodania aktualizuje się, kiedy został ponownie przeniesiony, ale wydaje się, że nie dotyczy to żadnych metadanych pliku , tylko metadane Spotlight.

Podsumowując, uważam, że Data Dodania jest przechowywana tylko gdzieś w dość tajemniczych wnętrznościach /.Spotlight-V100, i chyba że ktoś może wymyślić sposób, aby Spotlight zaktualizował wpis metadanych do dowolnej wartości, mogę „ widzę sposób na zrobienie tego.

Matt Gibson
źródło
Reflektor! Dobra robota.
Daniel
4

Dzięki Daniel Lawson za rozwiązanie! Nadal działa dobrze, nawet dwa lata później.

Mam dwa dodatki:

1) Pamiętaj, że w kodzie zaakceptowanej odpowiedzi jest mały błąd.

Ta linia:

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

... ma dodatkową apostrofę, co powoduje błąd „nieoczekiwany EOF”. Powinien brzmieć:

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

2) Co ważniejsze, począwszy od Mavericks 10.9.2, systemsetup wymaga uprawnień administratora. Dlatego każde wywołanie skryptu powłoki powinno być zgodne z następującą formułą:

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

Oto pełna zmodyfikowana wersja AppleScript, potwierdzona do pracy w 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
źródło
1
Witamy w Zapytaj inaczej! Zamiast pisać odpowiedź na odpowiedź edytować cudzego, wystarczy kliknąć edytować lub poprawić tę odpowiedź przycisk poniżej postu, który chcesz poprawić .
grg
Odpowiedź Daniela został został stworzony w celu uwzględnienia tych zmian.
Rory O'Kane,