Cómo configurar los metadatos de "fecha agregada" en Mac OS X 10.7 Lion

21

El Finder en Mac OS X 10.7 Lion muestra una nueva pieza de metadatos de archivo, "Fecha de adición", que registra la fecha en que se agregó un elemento a una carpeta. Después de actualizar a 10.7, ninguno de los elementos en mi carpeta ~/Downloads tiene valores de "Fecha de adición". Me gustaría configurar todos los valores vacíos de "Fecha agregada" para que coincidan con los valores de "Fecha de modificación", pero no puedo averiguar cómo configurar el atributo "Fecha agregada" en un valor específico.

Mi primera suposición fue esta:

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

Pero eso no parece funcionar (aunque tampoco informa un error).

    
pregunta John Siracusa 19.02.2012 - 18:26

4 respuestas

5

OK, nuevo enfoque aquí. Precaución: no tengo un sistema actualizado a Lion (mi computadora vino con Lion instalado), así que no puedo probar esto. Código no probado; Haga una copia de seguridad antes de probar este código.

Mi respuesta anterior se basó en el orden de clasificación utilizado por la pila de Descargas en el Dock. El campo Fecha agregada en el Finder parece estar basado en información de Spotlight, que es difícil de hackear. Tampoco es accesible a través de AppleScript. Pero, parece que hay una solución.

  1. Cree un nuevo flujo de trabajo en Automator.

  2. Establezca el flujo de trabajo para aceptar archivos o carpetas desde el Finder

  3. Haga que el flujo de trabajo ejecute un AppleScript.

Utilice este 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

Seleccione los archivos que aún no tienen una fecha agregada (ordenar por fecha agregada en el buscador, luego seleccione la parte de la lista sin una fecha agregada) y ejecute este servicio.

    
respondido por el Daniel 20.02.2012 - 06:08
7

Cuando ejecuto xattr -l en los elementos de mi carpeta de Descargas, obtengo un campo que se parece a esto:

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

Este es un plist binario. Cuando uso HexFiend para crear un archivo con esos bytes (sí, los ingresé manualmente; exploté desde el pasado como ingresar código de ensamblador de una revista en mi Apple] [GS), luego lo guardo como un archivo .plist, lo abrí el archivo en TextWrangler y obtuvo el siguiente xml sin compilar:

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

Dicho esto, aunque Apple parece almacenar las fechas en XML compilado, el texto sin formato parece funcionar.

En otras palabras, si puede obtener la fecha modificada del archivo en forma de cadena, puede ejecutar el comando xattr -w com.apple.metadata:kMDItemDownloadedDate "2012-02-19 16:34:47 +0000" file para cambiar la "fecha descargada", que parece ser el campo realmente ordenado, no la Fecha real agregada.

Finalmente, no obtuvo ningún error al agregar el campo (no utilizado) kMDItemDateAdded porque, como aprendí en este artículo , xattr felizmente establecerá cualquier campo de metadatos que desee, usado o no.

Ese es el núcleo de la respuesta. Trabajaré en escribir un AppleScript para obtener la fecha de modificación de cada archivo, comprobar si se establece kMDItemDownloadedDate y, si no lo es, establecer kMDItemDownloadedDate en la fecha de modificación, pero quería obtener el núcleo del respuesta publicada.

    
respondido por el Daniel 19.02.2012 - 19:05
4

No puedo encontrar una manera de establecer la "Fecha de adición" que se muestra en el Finder.

Creo que tienes razón en que se recupera del atributo kMDItemDateAdded metadata del índice de Spotlight. Sin embargo, Spotlight parece derivar esto de alguna manera.

He intentado configurar un atributo de archivo extendido llamado com.apple.metadata:kMDItemDateAdded a un valor de fecha en uno de varios formatos diferentes, incluido el formato usado por kMDItemDateAdded y ninguno de ellos fue seleccionado por el índice de Spotlight, es decir, no independientemente del valor mostrado por xattr , el valor mostrado por mdls no se modificó.

supongo , aunque no estoy seguro de que Spotlight simplemente establezca esta fecha basándose en la primera vez que indexa un archivo en una ubicación en particular, y no marca ninguna otra. Metadatos para generarlos. Si mv un archivo fuera de Descargas y vuelve a entrar, la fecha de actualización se actualizará cuando se movió nuevamente, pero ninguno de los metadatos de archivo parece afectado, solo los metadatos de Spotlight.

Así que, en resumen, reconozco que la Fecha de Agregación solo se almacena en algún lugar en las entrañas más bien crípticas de /.Spotlight-V100, y a menos que alguien pueda encontrar una manera de decirle a Spotlight que actualice una entrada de metadatos a un valor arbitrario, No puedo ver una manera de hacer esto.

    
respondido por el Matt Gibson 19.02.2012 - 20:24
4

¡Gracias a Daniel Lawson por la solución! Todavía funciona bien, incluso dos años después.

Tengo dos adiciones:

1) Tenga en cuenta que hay un pequeño error en el código de la respuesta aceptada.

Esta línea:

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

... tiene un apóstrofe adicional, lo que provoca un error "EOF inesperado". Debe leer:

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

2) Más importante, comenzando con Mavericks 10.9.2, la configuración de sistemas requiere derechos de administrador. Así que cada llamada a shell script debe seguir esta fórmula:

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

Aquí está la versión modificada completa de AppleScript, que se confirmó que funciona 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
    
respondido por el John Keller 17.06.2014 - 16:51

Lea otras preguntas en las etiquetas