Come impostare i metadati "data aggiunta" in Mac OS X 10.7 Lion

21

Il Finder in Mac OS X 10.7 Lion mostra un nuovo pezzo di metadati di file, "Data aggiunta", che tiene traccia della data in cui un elemento è stato aggiunto a una cartella. Dopo l'aggiornamento a 10.7, nessuno degli elementi nella mia cartella ~/Downloads ha valori "Data aggiunta". Mi piacerebbe impostare tutti i valori vuoti "Data aggiunta" in modo che corrispondano ai valori "Data modifica", ma non riesco a capire come impostare l'attributo "Data aggiunta" su un valore specifico.

La mia prima ipotesi è stata questa:

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

Ma non sembra funzionare (anche se non riporta un errore).

    
posta John Siracusa 19.02.2012 - 18:26
fonte

4 risposte

5

OK, nuovo approccio qui. Attenzione: non ho un sistema aggiornato a Lion (il mio computer è installato con Lion installato), quindi non posso testarlo. Codice non testato; eseguire il backup prima di provare questo codice !!!.

La mia risposta precedente era basata sull'ordinamento utilizzato dallo stack Download nel Dock. Il campo Data aggiunta nel Finder sembra essere basato su informazioni Spotlight, che è difficile da violare. Inoltre non è accessibile tramite AppleScript. Ma sembra che ci sia una soluzione alternativa.

  1. Crea un nuovo flusso di lavoro in Automator.

  2. Imposta il flusso di lavoro per accettare file o cartelle dal Finder

  3. Fai in modo che il flusso di lavoro esegua un AppleScript.

Usa questo 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

Seleziona i file che non hanno già una data di inserimento (ordina per data aggiunta nel Finder, quindi seleziona la parte dell'elenco senza una data di arrivo) ed esegui questo servizio.

    
risposta data 20.02.2012 - 06:08
fonte
7

Quando eseguo xattr -l sugli elementi nella mia cartella Download, ottengo un campo simile a questo:

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

Questo è un plist binario. Quando uso HexFiend per creare un file con quei byte (sì, li ho inseriti manualmente, esplodono dal passato come inserire il codice assembler da una rivista nella mia Apple] [GS), quindi salvarlo come file .plist, ho aperto il file in TextWrangler e ha ottenuto il seguente xml non compilato:

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

Detto questo, mentre Apple sembra memorizzare le date in XML compilato, il testo in chiaro sembra funzionare.

In altre parole, se è possibile ottenere la data di modifica del file in formato stringa, è possibile eseguire il comando xattr -w com.apple.metadata:kMDItemDownloadedDate "2012-02-19 16:34:47 +0000" file per modificare la "data di download", che sembra essere il campo effettivamente ordinato, non la data effettiva aggiunta.

Finalmente non hai ricevuto alcun errore quando aggiungi il campo (inutilizzato) kMDItemDateAdded perché, come ho imparato in questo articolo , xattr imposterà felicemente qualsiasi campo di metadati desiderato, usato o inutilizzato.

Questo è il nocciolo della risposta. Lavorerò scrivendo un AppleScript per ottenere la data di modifica per ogni file, controlla se kMDItemDownloadedDate è impostato, e se non lo è, imposta kMDItemDownloadedDate sulla data di modifica, ma volevo ottenere il nucleo del risposta pubblicata.

    
risposta data 19.02.2012 - 19:05
fonte
4

Non riesco a trovare un modo per impostare "Data aggiunta" mostrato nel Finder.

Credo che tu abbia ragione sul fatto che sia stato recuperato dall'attributo dei metadati kMDItemDateAdded dell'indice di Spotlight. Tuttavia, Spotlight sembra derivare esso stesso in qualche modo.

Ho provato a impostare un attributo di file esteso chiamato com.apple.metadata:kMDItemDateAdded a un valore di data in uno dei diversi formati, incluso il formato utilizzato da kMDItemDateAdded e nessuno di questi è stato rilevato dall'indice di Spotlight, ovvero no importa quale sia il valore mostrato da xattr , il valore mostrato da mdls non è stato modificato.

Vorrei indovina , anche se non lo so per certo, Spotlight imposta semplicemente questa data basandosi sulla prima volta che indicizza un file in una determinata posizione e non controlla nessun altro metadati per generarlo. Se mv un file esce da Download e torna indietro, gli aggiornamenti Data aggiunto a quando è stato spostato di nuovo, ma nessuno dei metadati file sembra interessato, solo i metadati di Spotlight.

Quindi, in sintesi, ritengo che Date Added sia memorizzato solo da qualche parte nell'intestino piuttosto criptico di /.Spotlight-V100, ea meno che qualcuno non riesca a trovare un modo per dire a Spotlight di aggiornare una voce di metadati a un valore arbitrario, Non riesco a vedere un modo per farlo.

    
risposta data 19.02.2012 - 20:24
fonte
4

Grazie a Daniel Lawson per la soluzione! Funziona ancora bene, anche due anni dopo.

Ho due aggiunte:

1) Si noti che c'è un piccolo errore nel codice della risposta accettata.

Questa riga:

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

... ha un apostrofo aggiuntivo, provocando un errore "EOF inatteso". Dovrebbe essere:

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

2) Più importante, a partire da Mavericks 10.9.2, systemetup richiede i diritti di amministratore. Quindi ogni chiamata allo script di shell dovrebbe seguire questa formula:

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

Ecco la versione completa di AppleScript, confermata per funzionare in 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
    
risposta data 17.06.2014 - 16:51
fonte

Leggi altre domande sui tag