Tienes esta al revés! En Linux (o Mac, o cualquier otro sistema Unix), ctime
normalmente siempre será MÁS TARDE que mtime
, no antes. A diferencia de Windows, donde ctime
es una fecha de creación del archivo y mtime
es una fecha de modificación del archivo, en Unix son ambas fechas de modificación, con la diferencia de que:
mtime
se actualiza cada vez que el archivo de contenido cambia
ctime
se actualiza cada vez que el archivo de atributos cambio, incluyendo su mtime
La página de manual para (al menos algunas variantes de) stat
utility se refiere a estos respectivamente como "Hora de la última modificación de datos" y "Hora del último cambio de estado".
Por lo tanto cada vez que mtime
se actualiza, ctime
también se actualiza. Los únicos mecanismos que conozco por el cual usted podría tener una mtime
que es mayor que el ctime
son:
- configuración manual de la
mtime
para estar en el futuro mediante el utime
or utimes
system calls, o una utilidad que los utiliza como touch -d
- la escritura en el disco de una manera que no pasa por el API del sistema de archivos de Linux, o de hecho no pasa por el sistema de archivos completo, como:
Desde lo solicitado en el contexto de Python, vamos a hacer una herramienta de Python simple que da salida a la mtime
y ctime
de un archivo determinado para ayudarnos a demostrar esto.Vamos a utilizar las convenientes os.path.getctime
y os.path.getctime
API en nuestro guión, pero utilizando los st_ctime
y st_mtime
propiedades del resultado de una llamada stat
daría exactamente el mismo resultado:
#!/usr/bin/python
import os
import sys
target_filename = sys.argv[1]
mtime = os.path.getmtime(target_filename)
ctime = os.path.getctime(target_filename)
print('mtime: %f ctime: %f' % (mtime, ctime))
podemos ahorrar que a medida que pystat.py
, hacen es ejecutable, y experimenta en nuestro shell Unix:
$ # Times are initially equal:
$ touch foo
$ ./pystat.py foo
mtime: 1473979539.786961 ctime: 1473979539.786961
$
$ # It doesn't matter how I create the file:
$ echo qwerty > bar
$ ./pystat.py bar
mtime: 1473979561.218961 ctime: 1473979561.218961
$
$ # 'touch'ing a created file updates both times:
$ touch foo
$ ./pystat.py foo
mtime: 1473979584.642960 ctime: 1473979584.642960
$
$ touch bar
$ ./pystat.py bar
mtime: 1473979592.762960 ctime: 1473979592.762960
$
$ # Modifying an existing file updates both times:
$ echo stuff >> foo
$ ./pystat.py foo
mtime: 1473979622.722959 ctime: 1473979622.722959
$
$ # Changing permissions ONLY updates the ctime:
$ chmod 777 foo
$ ./pystat.py foo
mtime: 1473979622.722959 ctime: 1473979643.542958
$
$ # So does moving a file:
$ mv bar baz
$ ./pystat.py baz
mtime: 1473979592.762960 ctime: 1473979659.586958
$
$ # Consequently, both files now have ctime > mtime
$
$ # However, we CAN manually set mtime in the future
$ # and thereby cause ctime < mtime:
$ touch --date="2041-01-01 12:34:56" foo
$ ./pystat.py foo
mtime: 2240656496.000000 ctime: 1473989678.258937
Esta pregunta era un poco confusa, y su respuesta aceptada es realmente muy incorrecta. Normalmente 'mtime <= ctime', ¡no al revés! Ver [mi respuesta] (http://stackoverflow.com/a/39521489/1709587) para una explicación y una demostración de esto en el shell. –
'ctime' no es creación en absoluto, es metadata ** change ** time. La respuesta aceptada es total y completamente errónea: no son solo "algunas situaciones" o (de lo contrario, como esa frase implica) casos de esquina raros donde esta suposición es inválida. –