Вы получили это неправильный путь круглый! В Linux (или Mac или любой другой системе Unix) ctime
обычно будет LATER, чем mtime
, ранее. В отличие от Windows, где ctime
это дата создания файла и mtime
является дата модификации файла в Unix они оба даты модификации, с той разницей, что:
mtime
обновляется всякий раз, когда файл содержание изменения
ctime
обновляется всякий раз, когда файл атрибуты изменения, в том числе его mtime
Страница руководства для (по крайней мере, некоторых вариантов) stat
utility относится к ним соответственно как «Время последней модификации данных» и «Время последнего изменения статуса».
Таким образом, всякий раз, когда mtime
обновляется, ctime
также обновляется. Единственные механизмы я знаю, с помощью которого вы могли бы получить mtime
, которое больше, чем ctime
являются:
- установки
mtime
вручную, чтобы быть в будущем, используя utime
or utimes
system calls или утилиту, которая использует их как touch -d
- записи на диск таким образом, чтобы в обход файловой системы Linux API, или действительно обходит файловую систему в целом, как:
Поскольку вы задали в контексте Python, давайте создадим простой инструмент Python, который выводит mtime
и ctime
данного файла, который поможет нам продемонстрировать это.Мы будем использовать удобные os.path.getctime
и os.path.getctime
API, в нашем сценарии, но с использованием st_ctime
и st_mtime
свойств в результате stat
вызова даст точно такие же результаты:
#!/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))
Мы можем сохранить, что, как pystat.py
, сделать его исполняемый файл и эксперимент в нашей оболочке 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
Этот вопрос был немного смущен, и его принятый ответ действительно действительно неправильный. Обычно 'mtime <= ctime', а не наоборот! См. [Мой ответ] (http://stackoverflow.com/a/39521489/1709587) для объяснения и демонстрации этого в оболочке. –
'ctime' вовсе не является созданием, это метаданные ** изменить ** время. Таким образом, принятый ответ полностью и полностью ошибочен: это не просто «некоторые ситуации» или (в противном случае, как следует из этой фразы) редкие угловые случаи, когда это предположение неверно! –