Cómo configurar metadatos de "fecha de adición" en Mac OS X 10.7 Lion

22

El Finder en Mac OS X 10.7 Lion muestra una nueva pieza de metadatos de archivo, "Fecha de adición", que rastrea la fecha en que se agregó un elemento a una carpeta. Después de actualizar a 10.7, ninguno de los elementos de mi ~/Downloadscarpeta tiene valores de "Fecha de adición". Me gustaría establecer todos los valores vacíos de "Fecha de adición" para que coincidan con los valores de "Fecha de modificación", pero no puedo entender cómo establecer el atributo "Fecha de adición" 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).

John Siracusa
fuente
¿Terminaste encontrando una solución?
erotsppa
1
La respuesta aceptada funcionó cuando lo intenté (tan loco como es).
John Siracusa

Respuestas:

7

OK, nuevo enfoque aquí. Precaución: no tengo un sistema actualizado a Lion (mi computadora venía con Lion instalado), así que no puedo probar esto. Código no probado; 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 haber una solución alternativa.

  1. Cree un nuevo flujo de trabajo en Automator.

  2. Configure el flujo de trabajo para aceptar archivos o carpetas del Finder agregando la acción "Solicitar elementos del Finder".

  3. Haga que el flujo de trabajo ejecute un AppleScript agregando la acción "Ejecutar AppleScript".

Use 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 de agregado (ordene por Fecha de agregado en el Finder, luego seleccione la parte de la lista sin Fecha de agregado) y ejecute este servicio.

captura de pantalla del flujo de trabajo en Automator

Daniel
fuente
2
Eso es horrible ... en el buen sentido, tal vez?
John Siracusa
1
Bueno, definitivamente es un truco. Pero parece que esa pieza particular de metadatos se calcula a partir de Spotlight, y sin hackear el oscuro misterio conocido como /.Spotlight-V100, esto podría ser tan bueno como sea posible. Pero me encantaría ver una respuesta limpia.
Daniel
¿Recibo un error extraño de este script? sh: -c línea 0: EOF inesperado mientras busca coincidencias ""
erotsppa
@erotsppa debería corregirse y actualizarse ahora.
Daniel
El AppleScript se detuvo con un error al procesar un archivo que tenía $su nombre, pero lo solucioné cambiando el nombre temporalmente de ese archivo. Para hacer el AppleScript manejar este tipo de archivos, mis búsquedas indican que podría reemplazar myfilecon quoted form of myfile, pero no he probado eso. Si se intenta eso, podría ser más claro hacer la cita al configurar myfiley cambiar el nombre de la variable quotedFilePath.
Rory O'Kane
7

Cuando ejecuto xattr -lelementos en mi carpeta de Descargas, aparece un campo que se ve así:

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; explosión del pasado como ingresar el código del ensamblador de una revista en mi Apple] [GS), luego guardarlo como un archivo .plist, 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 de modificación del archivo en forma de cadena, puede ejecutar el comando xattr -w com.apple.metadata:kMDItemDownloadedDate "2012-02-19 16:34:47 +0000" filepara cambiar la "fecha de descarga", que parece ser el campo realmente ordenado, no la Fecha de adición real.

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

Ese es el núcleo de la respuesta. Trabajaré en escribir un AppleScript para obtener la fecha de modificación para cada archivo, verificar si kMDItemDownloadedDateestá configurado y, si no lo está, establecer kMDItemDownloadedDate en la fecha de modificación, pero quería que se publicara el núcleo de la respuesta.

Daniel
fuente
1
Ejecute mdls en los archivos en su carpeta Descargas y verá los valores kMDItemDateAdded. Eso es lo que muestra la columna "Fecha de adición" en la vista de lista del Finder.
John Siracusa
Por cierto, si desea mostrar kMDItemDownloadedDate como información de plist sin pasar por HexFiend y TextWrangler, intente xattr -p com.apple.metadata:kMDItemDownloadedDate FILENAME_HERE | xxd -r -p | plutil -convert xml1 - -o -. El xxd convierte a datos de pliegue binario, luego los plutilconvierte a plist XML y los imprime.
Matt Gibson
OK, estoy sobre mi cabeza, me temo que decir. kMDItemDateAdded no aparece en la lista xattr -l, y kMDItemDownloadedDate no aparece en la lista mdls. Más curioso y más curioso. El campo Fecha agregada tampoco está almacenado en un xattr para el directorio . ¿Dónde viven estos metadatos?
Daniel
1
Dado que xattres un script de Python, supongo que debería ser posible hurgar en este script y descubrir cómo obtener los datos binarios del atributo en binario, en lugar de hexadecimal, para que pueda alimentarlo directamente plutil.
Harald Hanche-Olsen
4

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

Creo que tiene razón en que se ha recuperado del kMDItemDateAddedatributo de metadatos del índice de Spotlight . Sin embargo, Spotlight parece derivar esto de alguna manera.

Intenté configurar un atributo de archivo extendido llamado com.apple.metadata:kMDItemDateAddeda un valor de fecha en uno de varios formatos diferentes, incluido el formato utilizado kMDItemDateAddedy ninguno de ellos fue recogido por el índice de Spotlight, es decir, sin importar el valor mostrado xattr, el valor mostrado por mdlsno fue cambiado.

Me supongo , aunque no sé a ciencia cierta, que Spotlight simplemente establece esta fecha sobre la base de la primera vez que indexa un archivo en un lugar determinado, y no verifica cualquier otra metadatos con el fin de generarlo. Si mvun archivo sale de Descargas y vuelve a ingresar, la Fecha agregó actualizaciones a cuándo se movió nuevamente, pero ninguno de los metadatos del archivo parece afectado, solo los metadatos de Spotlight.

Entonces, en resumen, supongo que Date Added solo se almacena en algún lugar en las tripas bastante 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, puedo ' No veo una manera de hacer esto.

Matt Gibson
fuente
¡Destacar! Bien hecho.
Daniel
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, que desencadena un error "EOF inesperado". Debería leer:

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

2) Más importante, comenzando con Mavericks 10.9.2, la configuración del sistema requiere derechos de administrador. Por lo tanto, cada llamada al script de shell debe seguir esta fórmula:

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

Aquí está la versión modificada completa del AppleScript, confirmada para funcionar 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
John Keller
fuente
1
¡Bienvenido a Ask Different! En lugar de escribir una respuesta para editar la respuesta de otra persona, simplemente haga clic en editar o mejorar este botón de respuesta debajo de la publicación que desea mejorar .
grg
La respuesta de Daniel ha sido editada para incluir estos cambios.
Rory O'Kane