33 votes

Comment définir les métadonnées "date d'ajout" dans Mac OS X 10.7 Lion ?

Le Finder de Mac OS X 10.7 Lion affiche un nouvel élément de métadonnées de fichier, "Date d'ajout", qui indique la date à laquelle un élément a été ajouté à un dossier. Après la mise à niveau vers 10.7, aucun des éléments de mon dossier n'a été ajouté. ~/Downloads ont des valeurs "Date d'ajout". J'aimerais que toutes les valeurs vides de "Date d'ajout" correspondent aux valeurs de "Date de modification", mais je n'arrive pas à trouver comment définir l'attribut "Date d'ajout" sur une valeur spécifique.

Ma première idée était celle-ci :

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

Mais cela ne semble pas fonctionner (bien que cela ne signale pas non plus d'erreur).

10voto

Daniel Points 32917

OK, nouvelle approche ici. Attention : Je n'ai pas de système mis à jour vers Lion (mon ordinateur a été livré avec Lion installé) donc je ne peux pas tester ceci. Code non testé ; sauvegardez avant d'essayer ce code !

Ma réponse précédente était basée sur l'ordre de tri utilisé par la pile de téléchargements dans le Dock. Le champ Date d'ajout dans le Finder semble être basé sur des informations Spotlight, ce qui est difficile à pirater. Il n'est pas non plus accessible via AppleScript. Mais il semble exister une solution de contournement.

  1. Créez un nouveau flux de travail dans Automator.

  2. Configurez le flux de travail pour qu'il accepte les fichiers ou dossiers du Finder en ajoutant l'action "Demander les éléments du Finder".

  3. Demandez au flux de travail d'exécuter un AppleScript en ajoutant l'action "Exécuter AppleScript".

Utilisez cet 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

Sélectionnez les fichiers qui n'ont pas encore de date d'ajout (triez-les par date d'ajout dans le Finder, puis sélectionnez la partie de la liste sans date d'ajout) et exécutez ce service.

screenshot of the workflow in Automator

9voto

Daniel Points 32917

Quand je cours xattr -l sur les éléments de mon dossier Téléchargements, j'obtiens un champ qui ressemble à quelque chose comme ceci :

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

C'est un plist binaire. Lorsque j'utilise HexFiend pour créer un fichier avec ces octets (oui, je les ai saisis manuellement ; c'est comme si j'entrais le code assembleur d'un magazine dans mon Apple ][GS]), puis que je l'enregistre en tant que fichier .plist, j'ai ouvert le fichier dans TextWrangler et obtenu le xml non compilé suivant :

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

Cela dit, si Apple semble stocker les dates en XML compilé, le texte brut semble fonctionner.

En d'autres termes, si vous pouvez obtenir la date de modification du fichier sous la forme d'une chaîne, vous pouvez exécuter la commande suivante xattr -w com.apple.metadata:kMDItemDownloadedDate "2012-02-19 16:34:47 +0000" file pour modifier la "date de téléchargement", qui semble être le champ sur lequel le tri est effectué, et non la date réelle d'ajout.

Enfin, vous n'avez pas eu d'erreur lors de l'ajout de l'élément (inutilisé) kMDItemDateAdded car, comme je l'ai appris dans cet article , xattr se fera un plaisir de définir le champ de métadonnées que vous souhaitez, qu'il soit utilisé ou non.

C'est le cœur de la réponse. Je vais travailler sur l'écriture d'un AppleScript pour obtenir la date de modification de chaque fichier, vérifier si les fichiers sont modifiés. kMDItemDownloadedDate est défini, et s'il ne l'est pas, définir kMDItemDownloadedDate à la date modifiée, mais je voulais que le cœur de la réponse soit affiché.

4voto

sdfx Points 6428

Je ne trouve pas le moyen de définir la "date d'ajout" affichée dans le Finder.

Je crois que vous avez raison de dire qu'il est récupéré à partir de l'index Spotlight. kMDItemDateAdded attribut de métadonnées. Cependant, Spotlight semble le dériver lui-même d'une certaine manière.

J'ai essayé de mettre en place un attribut de fichier étendu appelé com.apple.metadata:kMDItemDateAdded à une valeur de date dans l'un des nombreux formats différents, y compris le format utilisé par kMDItemDateAdded et aucune d'entre elles n'a été relevée par l'indice Spotlight, c'est-à-dire quelle que soit la valeur indiquée par xattr la valeur indiquée par mdls n'a pas été modifié.

Je voudrais devinez Je pense, bien que je n'en sois pas sûr, que Spotlight fixe simplement cette date en fonction de la première fois qu'il indexe un fichier à un emplacement particulier, et ne vérifie aucune autre métadonnée pour la générer. Si vous mv un fichier hors de la section Téléchargements puis à nouveau dans la section, la date d'ajout est mise à jour à la date à laquelle le fichier a été replacé dans la section, mais aucun des éléments de la section archivo semble affectée, seulement les métadonnées Spotlight.

Donc, en résumé, je pense que la date d'ajout n'est stockée que quelque part dans les entrailles plutôt cryptiques de /.Spotlight-V100, et à moins que quelqu'un ne trouve un moyen de dire à Spotlight de mettre à jour une entrée de métadonnées avec une valeur arbitraire, je ne vois pas comment le faire.

4voto

John Keller Points 41

Merci à Daniel Lawson pour la solution ! Elle fonctionne toujours aussi bien, même deux ans plus tard.

J'ai deux ajouts :

1) Veuillez noter qu'il y a une petite erreur dans le code de la réponse acceptée.

Cette ligne :

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

...a une apostrophe supplémentaire, déclenchant une erreur "unexpected EOF". Il faut lire :

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

2) Plus important, à partir de Mavericks 10.9.2, systemsetup nécessite des droits d'administrateur. Donc chaque appel au shell script doit suivre cette formule :

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

Voici la version complète modifiée de l'AppleScript, dont le fonctionnement a été confirmé dans la version 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

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X