Comment définir les métadonnées «date ajoutée» dans Mac OS X 10.7 Lion


22

Le Finder dans Mac OS X 10.7 Lion affiche un nouveau morceau de métadonnées de fichier, "Date ajoutée", qui suit 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 ~/Downloadsdossier n'a de valeur "Date d'ajout". Je voudrais définir toutes les valeurs "Date d'ajout" vides pour correspondre aux valeurs "Date de modification", mais je ne sais pas comment définir l'attribut "Date d'ajout" à une valeur spécifique.

Ma première supposition était la suivante:

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

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


Avez-vous fini par trouver une solution?
erotsppa

1
La réponse acceptée a fonctionné quand je l'ai essayé (aussi fou que cela soit).
John Siracusa

Réponses:


7

OK, nouvelle approche ici. Attention: Je n'ai pas de système mis à niveau vers Lion (mon ordinateur est livré avec Lion installé), je ne peux donc pas le tester. 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 Téléchargements dans le Dock. Le champ Date d'ajout dans le Finder semble être basé sur des informations Spotlight, qui sont difficiles à pirater. Il n'est pas non plus accessible via AppleScript. Mais, il semble y avoir une solution de contournement.

  1. Créez un nouveau workflow dans Automator.

  2. Configurez le flux de travail pour accepter les fichiers ou dossiers du Finder en ajoutant l'action «Demander des éléments du Finder».

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

Utilisez ce 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 ajoutée (triez par date d'ajout dans le Finder, puis sélectionnez la partie de la liste sans date ajoutée) et exécutez ce service.

capture d'écran du flux de travail dans Automator


2
C'est affreux… dans le bon sens, peut-être?
John Siracusa

1
Eh bien, c'est définitivement un hack. Mais il semble que des métadonnées particulières soient calculées à partir de Spotlight, et sans pirater le sombre mystère /.Spotlight-V100, cela pourrait être aussi bon que possible. Mais je l' aime voir une réponse propre.
Daniel

Je reçois une erreur bizarre de ce script? sh: -c ligne 0: EOF inattendu lors de la recherche de la correspondance ""
erotsppa

@erotsppa, il devrait être corrigé et mis à jour maintenant.
Daniel

L'AppleScript s'est arrêté avec une erreur lors du traitement d'un fichier qui avait $son nom, mais j'ai contourné cela en renommant temporairement ce fichier. Pour l'AppleScript gérer ces fichiers, mes recherches indiquent que vous pouvez remplacer myfileavec quoted form of myfile, mais je n'ai pas testé cela. Si l'on essayait cela, il pourrait être plus clair de faire la citation lors de la définition myfileet du changement de nom de la variable quotedFilePath.
Rory O'Kane

7

Lorsque je lance des xattr -léléments dans mon dossier Téléchargements, j'obtiens un champ qui ressemble à 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

Ceci est un plist binaire. Lorsque j'utilise HexFiend pour créer un fichier avec ces octets (oui, je les ai entrés manuellement; souffle du passé comme entrer le code assembleur d'un magazine dans mon Apple] [GS), puis l'enregistrer en tant que fichier .plist, j'ai ouvert le fichier dans TextWrangler et a 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, alors qu'Apple semble stocker les dates dans du XML compilé, le texte brut semble fonctionner.

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

Enfin, vous n'avez reçu aucune erreur lors de l'ajout du kMDItemDateAddedchamp (inutilisé) , car, comme je l'ai appris dans cet article , xattrdéfinissez avec plaisir le champ de métadonnées que vous souhaitez, utilisé ou inutilisé.

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 elle kMDItemDownloadedDateest définie, et si ce n'est pas le cas, définir kMDItemDownloadedDate à la date modifiée, mais je voulais que le cœur de la réponse soit publié.


1
Exécutez mdls sur les fichiers de votre dossier Téléchargements et vous verrez les valeurs kMDItemDateAdded. C'est ce que montre la colonne "Date d'ajout" dans la vue Liste du Finder.
John Siracusa

Soit dit en passant, si vous souhaitez afficher le kMDItemDownloadedDate en tant qu'informations plist sans passer par HexFiend et TextWrangler, essayez xattr -p com.apple.metadata:kMDItemDownloadedDate FILENAME_HERE | xxd -r -p | plutil -convert xml1 - -o -. Le xxd convertit en données de plist binaire, puis le plutilconvertit en plist XML et l'imprime.
Matt Gibson

OK, je suis au-dessus de ma tête, j'ai peur de le dire. kMDItemDateAdded n'est pas répertorié dans xattr -l, et kMDItemDownloadedDate n'est pas répertorié avec mdls. Curieux et curieux. Le champ Date d'ajout n'est pas non plus stocké dans un xattr pour le répertoire . Où vivent ces métadonnées?
Daniel

1
Puisqu'il xattrs'agit d'un script python, je suppose qu'il devrait être possible de fouiller dans ce script et de comprendre comment obtenir les données binaires de l'attribut en binaire, plutôt qu'en hexadécimal, afin que vous puissiez le nourrir directement plutil.
Harald Hanche-Olsen

4

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

Je pense que vous avez raison de le récupérer à partir de l' kMDItemDateAddedattribut de métadonnées de l'index Spotlight . Cependant, Spotlight semble dériver cela lui-même d'une manière ou d'une autre.

J'ai essayé de configurer un attribut de fichier étendu appelé com.apple.metadata:kMDItemDateAddedà une valeur de date dans l'un des différents formats, y compris le format utilisé par kMDItemDateAddedet aucun d'entre eux n'a été récupéré par l'index Spotlight, c'est-à-dire quelle que soit la valeur affichée xattr, la valeur montré par mdlsn'a pas été modifié.

Je suppose , bien que je ne 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 afin de le générer. Si vous mvretirez un fichier des téléchargements et que vous le rentrez, la date d'ajout met à jour le moment où il a été réinstallé, mais aucune des métadonnées du fichier ne semble affectée, seules les métadonnées Spotlight.

Donc, en résumé, je pense que la date d'ajout n'est stockée que dans les tripes plutôt cryptiques de /.Spotlight-V100, et à moins que quelqu'un ne puisse trouver un moyen de dire à Spotlight de mettre à jour une entrée de métadonnées à une valeur arbitraire, je peux '' t voir un moyen de le faire.


Projecteur! Bien joué.
Daniel

4

Merci à Daniel Lawson pour la solution! Cela fonctionne toujours 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 "EOF inattendue". Il devrait se lire:

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

2) Plus important encore, à partir de Mavericks 10.9.2, la configuration du système nécessite des droits d'administrateur. Donc, chaque appel au script shell doit suivre cette formule:

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

Voici la version entièrement modifiée d'AppleScript, confirmée pour fonctionner en 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
Bienvenue sur Ask Different! Au lieu d'écrire une réponse à la réponse de modifier quelqu'un d' autre, cliquez simplement sur le modifier ou d' améliorer cette réponse bouton ci - dessous le message que vous souhaitez améliorer .
grg

La réponse de Daniel a été modifiée pour inclure ces changements.
Rory O'Kane
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.