Pregunta

Estoy teniendo problemas para usar os.utime para ajustar correctamente el tiempo de modificación en el Mac (Mac OS X 10.6.2, corriendo Python 2.6.1 de /usr/bin/python). No es consistente con la utilidad touch, y no es consistente con las propiedades que se muestran en la ventana del Finder "obtener información".

Tenga en cuenta la siguiente secuencia de comandos. Los tiempos 'creados' y 'modificadas' en el texto se refieren a los atributos que se muestran en la ventana de "obtener información" en el buscador. Como recordatorio, os.utime toma argumentos (filename, (atime, mtime)).

>>> import os
>>> open('tempfile','w').close()

'creada' y 'modificada' son a la vez la hora actual.

>>> os.utime('tempfile', (1000000000, 1500000000) )

'creado' es la hora actual, 'modificado' es 13 de julio 2017.

>>> os.utime('tempfile', (1000000000, 1000000000) )

'creada' y 'modificada' quedan ambos a 8 septiembre de 2001.

>>> os.path.getmtime('tempfile')
1000000000.0
>>> os.path.getctime('tempfile')
1269021939.0
>>> os.path.getatime('tempfile')
1269021951.0

... pero el os.path.get?time y os.stat no reflejan la misma.

>>> os.utime('tempfile', (1500000000, 1000000000) )

'creada' y 'modificada' son Todavía encuentran a 8 septiembre de 2001.

>>> os.utime('tempfile', (1500000000, 1500000000) )

'creado' es de 8 de septiembre de 2001 'modificado' es de 13 de julio de, 2017.

No estoy seguro si esto es un problema Python o un problema stat Mac. Cuando salir del shell Python y corro

touch -a -t 200011221234 tempfile

ni la modificación ni la creación tiempos cambian, como se esperaba. Luego ejecutar

touch -m -t 200011221234 tempfile

y ambos 'creados' y los tiempos de 'modificado' se cambian.

¿Alguien tiene alguna idea de lo que está pasando? ¿Cómo cambio los tiempos de modificación y creación consistente en el mac? (Sí, soy consciente de que en los sistemas Unixy no hay "tiempo de creación.")


El resultado de ejecutar el guión de Chris Johnsen:

seth@local:~$ /usr/bin/python timetest.py tempfile 5
initial:
(1269631281.0, 1269631281.0, 1269631281.0, 1269631281, 1269631281, 1269631281)

test: (1000000000, 1000000000)
(1000000000.0, 1000000000.0, 1269631281.0, 1000000000, 1000000000, 1269631281)
(1269631281.0, 1000000000.0, 1269631281.0, 1269631281, 1000000000, 1269631281)

test: (1000000000, 1500000000)
(1000000000.0, 1500000000.0, 1269631286.0, 1000000000, 1500000000, 1269631286)
(1269631286.0, 1500000000.0, 1269631286.0, 1269631286, 1500000000, 1269631286)

test: (1500000000, 1000000000)
(1500000000.0, 1000000000.0, 1269631291.0, 1500000000, 1000000000, 1269631291)
(1269631291.0, 1000000000.0, 1269631291.0, 1269631291, 1000000000, 1269631291)

test: (1500000000, 1500000000)
(1500000000.0, 1500000000.0, 1269631296.0, 1500000000, 1500000000, 1269631296)
(1269631296.0, 1500000000.0, 1269631296.0, 1269631296, 1500000000, 1269631296)

Al final del ejercicio, la fecha de 'creado' como es visible en el visor es 08/09/01 y la fecha 'modificado' es 13/07/17. (La fecha de acceso, gracias a suponer centro de atención como usted sugiere y como he leído, es más o menos 'ahora'.) Las fechas de creación y modificación visible en el visor todavía no tienen sentido.

¿Fue útil?

Solución

POSIX atime , mtime , ctime

Podría ayudar si se incluye un guión completo y sus resultados reales y esperados en lugar de los fragmentos REPL.

import sys, os, stat, time

def get_times(p):
    s = os.stat(p)
    return ( 
        os.path.getatime(p),
        os.path.getmtime(p),
        os.path.getctime(p),
        s[stat.ST_ATIME],
        s[stat.ST_MTIME],
        s[stat.ST_CTIME],
    )

def main(p, delay=1):
    delay = float(delay)
    (a,b) = (1000000000, 1500000000)

    open(p,'w').close()

    print 'initial:'
    print get_times(p)

    for t in [ (a,a), (a,b), (b,a), (b,b) ]:
        print
        print 'test:', t
        os.utime(p,t)
        print get_times(p)
        time.sleep(delay)
        print get_times(p)

main(*sys.argv[1:])

Me sale este en mi sistema con 10,4 cd "$HOME" && python test.py tempfile 5 (Python por defecto del sistema 2.3.6 y 2.6.4 de Python DarwinPorts ambos dan el mismo resultado (dejando de lado los tiempos iniciales y ctime , por supuesto)) :

% python /tmp/test.py tempfile 5
initial:
(1000000000.0, 1000000000.0, 1269629881.0, 1000000000, 1000000000, 1269629881)

test: (1000000000, 1000000000)
(1000000000.0, 1000000000.0, 1269629881.0, 1000000000, 1000000000, 1269629881)
(1000000000.0, 1000000000.0, 1269629881.0, 1000000000, 1000000000, 1269629881)

test: (1000000000, 1500000000)
(1000000000.0, 1500000000.0, 1269629886.0, 1000000000, 1500000000, 1269629886)
(1000000000.0, 1500000000.0, 1269629886.0, 1000000000, 1500000000, 1269629886)

test: (1500000000, 1000000000)
(1500000000.0, 1000000000.0, 1269629891.0, 1500000000, 1000000000, 1269629891)
(1500000000.0, 1000000000.0, 1269629891.0, 1500000000, 1000000000, 1269629891)

test: (1500000000, 1500000000)
(1500000000.0, 1500000000.0, 1269629896.0, 1500000000, 1500000000, 1269629896)
(1500000000.0, 1500000000.0, 1269629896.0, 1500000000, 1500000000, 1269629896)

Esto parece razonable. Me pregunto lo que se obtiene.

He oído que a veces puede restablecer Spotlight agresiva atime debido a la re-indexación de los archivos modificados. Yo no esperaría que volver a indexar un archivo que sólo utime (ha sufrido) / (utimes), pero supongo que es posible. Para eliminar Spotlight como una complicación posible utilizar un archivo en un lugar que no está indexado por Spotlight (por ejemplo / tmp / testfile).

Fecha de creación en Buscador

(que se muestra como “Creado:” Obtener Información en las ventanas de Finder)

Si tiene instaladas las herramientas de desarrollador, puede utilizar /Developer/Tools/GetFileInfo para ver el HFS fechaCreacion. Añadí las siguientes líneas después de cada línea print get_times(p):

sys.stdout.flush()
os.system('/Developer/Tools/GetFileInfo ' + p)

También cambió la iteración para que coincida con su descripción inicial ([ (a,b), (a,a), (b,a), (b,b) ]).

El resultado ahora se ve así:

% rm /tmp/tempfile; python /tmp/test.py /tmp/tempfile 1
initial:
(1269636574.0, 1269636574.0, 1269636574.0, 1269636574, 1269636574, 1269636574)
file: "/private/tmp/tempfile"
type: ""
creator: ""
attributes: avbstclinmedz
created: 03/26/2010 15:49:34
modified: 03/26/2010 15:49:34

test: (1000000000, 1500000000)
(1000000000.0, 1500000000.0, 1269636574.0, 1000000000, 1500000000, 1269636574)
file: "/private/tmp/tempfile"
type: ""
creator: ""
attributes: avbstclinmedz
created: 03/26/2010 15:49:34
modified: 07/13/2017 21:40:00
(1000000000.0, 1500000000.0, 1269636574.0, 1000000000, 1500000000, 1269636574)
file: "/private/tmp/tempfile"
type: ""
creator: ""
attributes: avbstclinmedz
created: 03/26/2010 15:49:34
modified: 07/13/2017 21:40:00

test: (1000000000, 1000000000)
(1000000000.0, 1000000000.0, 1269636576.0, 1000000000, 1000000000, 1269636576)
file: "/private/tmp/tempfile"
type: ""
creator: ""
attributes: avbstclinmedz
created: 09/08/2001 20:46:40
modified: 09/08/2001 20:46:40
(1000000000.0, 1000000000.0, 1269636576.0, 1000000000, 1000000000, 1269636576)
file: "/private/tmp/tempfile"
type: ""
creator: ""
attributes: avbstclinmedz
created: 09/08/2001 20:46:40
modified: 09/08/2001 20:46:40

test: (1500000000, 1000000000)
(1500000000.0, 1000000000.0, 1269636577.0, 1500000000, 1000000000, 1269636577)
file: "/private/tmp/tempfile"
type: ""
creator: ""
attributes: avbstclinmedz
created: 09/08/2001 20:46:40
modified: 09/08/2001 20:46:40
(1500000000.0, 1000000000.0, 1269636577.0, 1500000000, 1000000000, 1269636577)
file: "/private/tmp/tempfile"
type: ""
creator: ""
attributes: avbstclinmedz
created: 09/08/2001 20:46:40
modified: 09/08/2001 20:46:40

test: (1500000000, 1500000000)
(1500000000.0, 1500000000.0, 1269636578.0, 1500000000, 1500000000, 1269636578)
file: "/private/tmp/tempfile"
type: ""
creator: ""
attributes: avbstclinmedz
created: 09/08/2001 20:46:40
modified: 07/13/2017 21:40:00
(1500000000.0, 1500000000.0, 1269636578.0, 1500000000, 1500000000, 1269636578)
file: "/private/tmp/tempfile"
type: ""
creator: ""
attributes: avbstclinmedz
created: 09/08/2001 20:46:40
modified: 07/13/2017 21:40:00

Esto parece ser consistente con las observaciones de su ventana Obtener información en Buscador . Mi interpretación (confirmado por otros experimentos) es que el HFS fechaCreacion es actualizada por utime, pero solamente siempre va hacia atrás (no hacia delante). Si desea actualizar el HFS fechaCreacion a un valor más nuevo, entonces es probable que tenga que utilizar una API específicas para Mac para hacerlo.

Otra nota: puede que tenga que cambiar de ventana un poco para conseguir el Obtener información ventana para actualizar. En mi sistema, la pantalla no se actualiza automáticamente a menos que cambiar de ventana, ya sea hacia o desde la ventana Obtener información.

Otros consejos

Mac OS mantiene atributos adicionales que no se asignan a POSIX.

  • CreateDate
  • contentModDate
  • attributeModDate
  • fechaacceso
  • backupDate

Se utiliza para poder acceder a ellos a través del módulo macfs viejos, que fue hace mucho tiempo está desfasada y en el módulo de carbono, que está muy poco documentada, y también se ha dejado de utilizar. Creo Carbon.File y Carbon.Folder tienen lo que necesita. (No sigo Mac suficiente para saber lo que el plan actual es que estas características. Quizás carbono es simplemente ser retirado del stdlib, y continuará por sí mismo.)

Tal vez un comentario detallando lo que estás buscando ayudaría, en lugar de un downvote

No estoy exactamente seguro de lo que otra consistencia que usted espera. Python utiliza una API POSIX, y las herramientas de Apple están utilizando la API de Apple. Cada uno parece ser internamente consistentes, pero pueden diferir entre sí.

  • attributeModDate se asigna a ctime.
  • CreateDate es lo Buscador de muestra para "creado"
  • Si cambia a -mtime antes de lo CreateDate, la API del sistema de archivos Mac cambiará el CreateDate para que coincida; que evita la inconsistencia de una modificación aparente antes de una creación. Esto se refiere a la única comportamiento incoherente que he entendido de su ejemplo anterior.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top