Настройка создания или изменения временных меток

С помощью utimes, futimes, futimensи т. д., можно установить временные метки доступа и изменения для файла.

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

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

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

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

5 ответов

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

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

# Update ctime
debugfs -w -R 'set_inode_field /tmp/foo ctime 201001010101' /dev/sda1

# Drop vm cache so ctime update is reflected
echo 2 > /proc/sys/vm/drop_caches

Информация взята из Command Line Kung Fu блог.

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

/questions/4360130/ustanovka-izmenenie-atributa-ctime-ili-izmenit-vremya-v-fajle/4360136#4360136

По сути, есть два варианта:

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

Согласно 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) change System time
2) copy paste a file on another location.

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

Сценарий ниже автоматизирует запуск debugfs ... set_inode_field ... ctime ...в ответе ismail для многих файлов. Он скопирует значения ctime из файлов в /media/MYUSER/MYFS/FOO/BAR (рекурсивно) в /media/MYUSER/MYFS2/FOO/BAR, и umount в качестве побочного эффекта. Он будет работать, только если файловая система /media/MYUSER/MYFS2 это ext2, ext3 или ext4 (потому что debugfs работает только для этих файловых систем).

      mydev2="$(df /media/MYUSER/MYFS2 | perl -ne '$x = $1 if !m@^Filesystem @ and m@([^ ]+) @; END { print "$x\n" }')"
cd /media/MYUSER/MYFS
find FOO/BAR -type f | perl -ne 'chomp; my @st = lstat($_); if (@st and -f(_)) { s@"@""@g; print "set_inode_field \"/$_\" ctime \@$st[10]\n" }' >/tmp/sif.out
sudo umount /media/MYUSER/MYFS2  # Repeat until success.
sudo debugfs -w -f /tmp/sif.out /dev/"$mydev2"

Он правильно обрабатывает имена файлов с пробелами и специальными символами.

Он работает независимо от часовых поясов. В качестве ограничения debugfs его точность равна секундам, он игнорирует все, что меньше (например, миллисекунды, микросекунды, наносекунды). В зависимости от используемой версии debugfs он может использовать 32-битные временные метки, поэтому он корректно работает с датами до 19 января 2038 года.

Если у текущего пользователя недостаточно прав на чтение для /media/MYUSER/MYFS, то приведенные выше команды следует запускать от имени пользователя root ( sudo bash).

Другие вопросы по тегам