Как изменить ТОЛЬКО время изменения к файла?

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
жучара
Сообщения: 969
ОС: астралинукс

Как изменить ТОЛЬКО время изменения к файла?

Сообщение жучара »

Друзья! Вот времена файла:

Shell

$ stat foo
Файл: foo
Размер: 164 Блоков: 8 Блок В/В: 4096 обычный файл
Устройство: 8/22 Инода: 9270823 Ссылки: 1
Доступ: (0644/-rw-r--r--) Uid: ( 1000/ user) Gid: ( 1000/ user)
Доступ: 2024-07-07 16:29:20.107231529 +0500
Модифицирован: 2024-07-07 16:02:00.000000000 +0500
Изменён: 2024-07-07 16:33:34.099084920 +0500
Создан: 2024-07-07 00:17:59.450498324 +0500
$
Вот мне нужно изменить ту, которая дата изменения, а другие не трогать. touch не справляется.
--------------------------------------------------
Конкретнее- мне нужно приравнять дату изменения к дате модификации. Команда touch -m меняет и время модификации и время изменения на текущее:

Shell

$ touch -m foo
$
$ stat foo
Файл: foo
Размер: 164 Блоков: 8 Блок В/В: 4096 обычный файл
Устройство: 8/22 Инода: 9270823 Ссылки: 1
Доступ: (0644/-rw-r--r--) Uid: ( 1000/ user) Gid: ( 1000/ user)
Доступ: 2024-07-07 16:29:20.107231529 +0500
Модифицирован: 2024-07-07 16:35:58.407486819 +0500
Изменён: 2024-07-07 16:35:58.407486819 +0500
Создан: 2024-07-07 00:17:59.450498324 +0500
user@debian:~/Desktop/qqq$
Поэтому если есть параметр-время, который можно передать команде touch, то проблема решится. И такой парамер есть

Shell

$ man touch
-t STAMP
...
$
То есть я нахожу время модификации, а потом командую вот так:
touch -m foo -t <время модификации>

И то и то время изменится. Время модификации изменится само на себя, а время изменения станет ему равным, что мне и нужно. Но как бы не так. Забегая вперёд скажу, что эта схема для времени изменения файла не работает. Оно действительно изменяется, но на текущее. Убедимся в этом:

Cмотрим времена файлов:

Shell

$ stat foo
Файл: foo
Размер: 164 Блоков: 8 Блок В/В: 4096 обычный файл
Устройство: 8/22 Инода: 9270823 Ссылки: 1
Доступ: (0644/-rw-r--r--) Uid: ( 1000/ user) Gid: ( 1000/ user)
Доступ: 2024-07-07 16:29:20.107231529 +0500
Модифицирован: 2024-07-07 16:45:21.796442264 +0500
Изменён: 2024-07-07 16:45:21.796442264 +0500
Создан: 2024-07-07 00:17:59.450498324 +0500
$
Получаем время модификации файла:

Shell

$ vm=$(stat -c %Y foo)
$
Преобразуем его в приемлемый для команды touch формат:

Shell

$ ttt=$(date -d @$vm +%y%m%d%H%M)
$
Применим изменения к файлу:

Shell

$ touch -m -t $ttt foo
$
Смотрим времена файла:

Shell

$ stat foo
Файл: foo
Размер: 164 Блоков: 8 Блок В/В: 4096 обычный файл
Устройство: 8/22 Инода: 9270823 Ссылки: 1
Доступ: (0644/-rw-r--r--) Uid: ( 1000/ user) Gid: ( 1000/ user)
Доступ: 2024-07-07 16:29:20.107231529 +0500
Модифицирован: 2024-07-07 16:45:00.000000000 +0500
Изменён: 2024-07-07 16:50:21.553384809 +0500
Создан: 2024-07-07 00:17:59.450498324 +0500
$
Ничё не вышло. Время модификации осталось равно самому себе (как было заявлено), а время изменения файла изменилось на текущее, что мне не надо было. Не работает тут опция -t STAMP

...Так как же изменить время создания файла? Спасибо, то откликнется. Debian 12
Offtopic
(разбираюсь с инкрементным архивированием tar и есть в нём одна закавыка.)
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5325
ОС: Gentoo

Re: Как изменить ТОЛЬКО время изменения к файла?

Сообщение /dev/random »

жучара писал(а):
07.07.2024 15:07
Как изменить ТОЛЬКО время изменения к файла?
жучара писал(а):
07.07.2024 15:07
...Так как же изменить время создания файла?
Так изменения или создания?

У файла есть 4 времени:
  • btime: время создания, изменить невозможно*. Только пересоздавать файл (например, путём копирования).
  • mtime: время изменения данных, меняется через touch -m.
  • ctime: время изменения метаданных, меняется на текущее время всегда при изменении чего угодно о файле (в некоторых ФС - чего угодно, кроме автоматического изменения atime). Вручную изменить невозможно*.
  • atime: время чтения, меняется через touch -a; для оптимизации производительности автоматическое изменение может происходить не всегда, как вам описали в другой теме.
Во всех функциях, системных вызовах и утилитах, меняющих timestamp'ы файла, речь всегда идёт только о mtime и atime.

* "Изменить невозможно" следует читать как "изменить невозможно, если не лезть грязными руками отладочными средствами во внутренности ФС".
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 969
ОС: астралинукс

Re: Как изменить ТОЛЬКО время изменения к файла?

Сообщение жучара »

/dev/random писал:
08.07.2024 13:04
Так изменения или создания?
извинете, конечно, изменения.
...Понимаете, в чём дело. Если инкрементно архивируешь какую-нибудь папку таром, допустим, раз, другой, третий, то получается первый архив большой, в остальные маленькие- в них только переделанные (нейтральный термин) и вновь появившиеся файлы.

Если потом с этой папкой что-то случится, её можно восстановить.

И если опять её инкременировать, то инкременация считается первой по счёту и опять мы получаем большой файл вместо ожидаемого маленького. А почему? А потому, что у всех распакованных файлах время модификации (mtime) стоит какая надо- типа они сделаны давно (tar её при архивации сохраняет, а при разархивации использует)
Но вот время изменения (ctime) у всех распакованных файлов будет ТЕКУЩИМ. Поэтому если мы эту папку начнём инкременировать- опять будет первый большой архив. И как с этим бороться- ну вот, я хотел вручную пробежаться по файлам и приравнять их дату изменения к дате модификации.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 969
ОС: астралинукс

Re: Как изменить ТОЛЬКО время изменения к файла?

Сообщение жучара »

Ну что же, если гора не идёт к Мамомеду, тогда Магомед идёт к горе. Если не править файловую систему, тогда править только файл *.snar.
...То есть, разархивировал, допустим, восстановленную папку. Теперь все элементы в ней имеют время изменения- текущее и при следующей архивации сархивируются, даже если их вообще не трогать. Изменим *.snar. Поправим поле, которое здесь описано как:
First two records are decimal integers, representing the time of the last backup. First number is the number of seconds, the second one is the number of nanoseconds, since the beginning of the epoch.
Сделаем поле, которое "First number" текущей датой. Это нужно сделать сразу же после разархивации. Ну и всё. При последующем инкрементном архивировании архивироваться будут те файлы, которые вновь созданы, то есть после текущей даты, что нам и нужно.
Я просто читаю маны.
Спасибо сказали: