Настройка создания или изменения временных меток - PullRequest
21 голосов
/ 27 декабря 2010

Используя utimes, futimes, futimens и т. Д., Можно установить метки времени доступа и изменения для файла.

Время модификации - это последний раз, когда данные файла изменялись.Аналогично, «ctime» или время изменения - это последние атрибуты времени файла, такие как разрешения, были изменены.(Linux / POSIX поддерживает три метки времени: mtime и ctime, которые уже обсуждались, и 'atime' или время доступа.)

Есть ли функция для установки меток времени изменения?(Где «изменение» - это атрибут модификации или «ctime», , а не время модификации «mtime».) (Я понимаю циклическую природу желания изменить метку времени изменения, но думаю, что программное обеспечение для архивации - это было быприятно восстановить файл точно так, как он был.)

Есть ли вообще какие-либо функции для создания меток времени?(Я понимаю, что ext2 не поддерживает это, но мне было интересно, если Linux поддерживал те файловые системы, которые его поддерживают.)

Если это невозможно, то почему это не так?

Ответы [ 4 ]

20 голосов
/ 27 декабря 2010

Для ext2/3 и, возможно, для ext4 вы можете сделать это с помощью инструмента debugfs, предполагая, что вы хотите изменить ctime файла /tmp/foo, который находится на диске /dev/sda1, для которого мы хотим установить ctime201001010101, что означает 01 января 2010 года, время 01: 01:

Предупреждение: диск должен быть размонтирован перед этой операциейCommand Line Kung Fu блог.

8 голосов
/ 12 июня 2013

У меня была похожая проблема, и я написал здесь свой ответ.

https://stackoverflow.com/a/17066309/391040

Существуют два варианта:

  1. Незначительные изменения в ядре (код включен в ссылку)
  2. Измените системные часы на нужное время, коснитесь файла и восстановите текущее время. (сценарий оболочки для этого включен в ссылку).
5 голосов
/ 01 июля 2013

Согласно http://lists.gnu.org/archive/html/coreutils/2010-08/msg00010.html ctime не может быть подделано (по крайней мере, оно не предназначено для подделки):

POSIX говорит, что atime и mtime устанавливаются пользователем на произвольное время через семейство системных вызовов utimensat (), но ctime должно незаслуженно отслеживать текущее время любого действия, которое изменяет файл метаданные или содержимое.

Если вам просто нужно изменить ctime файла для некоторого тестирования / отладки, bindfs может быть полезным. Это файловая система FUSE, которая монтирует один каталог в другое место и может выполнять некоторые преобразования атрибутов файла. С опцией --ctime-from-mtime ctime каждого файла совпадает с его временем mtime, которое вы можете установить с помощью touch -t.

1 голос
/ 19 апреля 2016

Самый простой способ:

1) change System time
2) copy paste a file on another location.

Я пробовал это на windows 7 и мне удалось изменить все три метки времени.Команда stat в linux показывает, что все три метки времени изменены.

...