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


22

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 ~/Downloadscartella ha valori "Data aggiunta". Vorrei impostare tutti i valori "Data aggiunta" vuoti 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 questo non sembra funzionare (anche se non segnala neanche un errore).


Hai finito per trovare una soluzione?
erotsppa,

1
La risposta accettata ha funzionato quando l'ho provata (per quanto folle).
Giovanni Siracusa,

Risposte:


7

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

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

  1. Crea un nuovo flusso di lavoro in Automator.

  2. Imposta il flusso di lavoro in modo che accetti file o cartelle dal Finder aggiungendo l'azione "Richiedi elementi del Finder".

  3. Chiedi al flusso di lavoro di eseguire un AppleScript aggiungendo l'azione "Esegui 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 a cui non è già stata aggiunta una data (ordina per Data aggiunta nel Finder, quindi seleziona la parte dell'elenco senza una data aggiunta) ed esegui questo servizio.

screenshot del flusso di lavoro in Automator


2
È terribile ... in senso buono, forse?
Giovanni Siracusa,

1
Bene, è sicuramente un trucco. Ma sembra che un particolare pezzo di metadati sia calcolato da Spotlight e senza hackerare il mistero oscuro noto come /.Spotlight-V100, questo potrebbe essere buono come si arriva. Ma mi piacerebbe piace vedere una risposta pulita.
Daniel

Ricevo uno strano errore da questo script? sh: -c linea 0: EOF inatteso mentre si cerca la corrispondenza ""
erotsppa,

@erotsppa dovrebbe essere corretto e aggiornato ora.
Daniel

AppleScript si è interrotto con un errore durante l'elaborazione di un file che aveva il $suo nome, ma ho risolto il problema rinominando temporaneamente quel file. Per rendere l'AppleScript gestire tali file, le mie ricerche indicano che si potrebbe sostituire myfilecon quoted form of myfile, ma non ho ancora testato questo. Se uno lo provasse, potrebbe essere più chiaro fare il preventivo quando si imposta myfilee rinomina la variabile quotedFilePath.
Rory O'Kane,

7

Quando corro xattr -lsu elementi nella mia cartella Download, ottengo un campo che assomiglia 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; esplodo 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 normale sembra funzionare.

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

Alla fine non hai riscontrato alcun errore quando aggiungi il kMDItemDateAddedcampo (non utilizzato) perché, come ho appreso in questo articolo , xattrimposterà felicemente qualunque campo di metadati desideri, utilizzato o non utilizzato.

Questo è il nocciolo della risposta. Lavorerò sulla scrittura di un AppleScript per ottenere la data modificata per ciascun file, verificare se kMDItemDownloadedDateè impostato e, in caso contrario, impostare kMDItemDownloadedDate sulla data modificata, ma volevo che il nucleo della risposta fosse pubblicato.


1
Esegui mdls sui file nella cartella Download e vedrai i valori kMDItemDateAdded. Ecco cosa mostra la colonna "Data aggiunta" nella vista Elenco del Finder.
John Siracusa,

Per inciso, se si desidera mostrare kMDItemDownloadedDate come informazioni di pianificazione senza passare attraverso HexFiend e TextWrangler, provare xattr -p com.apple.metadata:kMDItemDownloadedDate FILENAME_HERE | xxd -r -p | plutil -convert xml1 - -o -. Il xxd converte in dati binari di plist, quindi li plutilconverte in plist XML e li stampa.
Matt Gibson,

OK, sono sopra la mia testa, ho paura di dire. kMDItemDateAdded non è elencato in xattr -le kMDItemDownloadedDate non è elencato con mdls. Curioso e curioso. Né il campo Data aggiunta è memorizzato in un xattr per la directory . Dove vivono questi metadati?
Daniel

1
Dato che xattrè uno script Python, suppongo che dovrebbe essere possibile curiosare in questo script e capire come ottenere i dati binari dell'attributo in binario, anziché in esadecimale, in modo da poterlo fornire direttamente plutil.
Harald Hanche-Olsen,

4

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

Credo che tu abbia ragione nel ritenerlo dall'attributo dei kMDItemDateAddedmetadati dell'indice Spotlight . Tuttavia, Spotlight sembra derivarne da sé in qualche modo.

Ho provato a impostare un attributo di file esteso chiamato com.apple.metadata:kMDItemDateAddeda un valore di data in uno di diversi formati diversi, incluso il formato utilizzato da kMDItemDateAddede nessuno di essi è stato raccolto dall'indice Spotlight, vale a dire indipendentemente dal valore mostrato da xattr, il valore mostrato da mdlsnon è stato modificato.

Mi immagino , anche se non so per certo, che Spotlight imposta semplicemente questa data base la prima volta che gli indici di un file in un determinato luogo, e non controlla alcuna altri metadati al fine di generare esso. Se mvun file esce da Download e rientra, la Data aggiunta si aggiorna a quando è stato spostato indietro, ma nessuno dei metadati del file sembra interessato, solo i metadati Spotlight.

Quindi, in sintesi, credo che la data aggiunta sia memorizzata solo da qualche parte nelle viscere piuttosto criptiche di /.Spotlight-V100 e, a meno che qualcuno non riesca a trovare un modo per dire a Spotlight di aggiornare una voce di metadati a un valore arbitrario, posso ' vedo un modo per farlo.


Riflettore! Molto bene.
Daniel

4

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

Ho due aggiunte:

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

Questa linea:

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

... ha un apostrofo aggiuntivo, che genera un errore "EOF imprevisto". Dovrebbe leggere:

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

2) Più importante, a partire da Mavericks 10.9.2, la configurazione dei sistemi richiede i diritti di amministratore. Quindi ogni call per shell script dovrebbe seguire questa formula:

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

Ecco la versione completamente modificata 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

1
Benvenuti a chiedere diverso! Invece di scrivere una risposta alla risposta di modifica di qualcun altro, è sufficiente fare clic su Modifica o migliorare questa risposta tasto sotto il post che volete migliorare .
grg

La risposta di Daniel è stata modificata per includere queste modifiche.
Rory O'Kane,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.