LINUX.ORG.RU

Перезапись файлов затирает их дату создания

 


0

1

При перезаписи файла его новой версией ставит в дату создания то время, когда он был перезаписан. Как сделать так, чтобы при перезаписи оставалась дата создания, как это делают программы при модификации (например Kate, nano)? (Больше всего нужно это сделать в Dolphin)

Debian 12.0



Последнее исправление: Velent (всего исправлений: 2)

Ответ на: комментарий от monkdt

Действительно, попробовал сделать перезаписать через cp или mv - дата содания новая. Но при том, Kate или тот же nano при модификации файла работают как надо, сохраняя дату создания. Почему так - не совсем понимаю

Velent
() автор топика
Ответ на: комментарий от Velent

попробовал сделать перезаписать через cp или mv - дата содания новая.

cp -p, mv должен работать правильно «из коробки».

ПыСы. «Правильно» здесь означает «ctime должен быть как у source».

Но при том, Kate или тот же nano при модификации файла работают как надо, сохраняя дату создания. Почему так - не совсем понимаю

Очевидно, редактор делает дополнительные телодвижения чтобы запрезёрвить ctime.

bugfixer ★★★★★
()
Последнее исправление: bugfixer (всего исправлений: 2)
Ответ на: комментарий от monkdt

при сохранении изменений в файле не создается его новая копия.

Если они действительно так сделали - за такое надо бубенцы откручивать. Нормальные люди сохраняются во временный файл, и только после успешного fsync() - ротейтят.

bugfixer ★★★★★
()
Ответ на: комментарий от monkdt

а кто у нас нормальные люди?

Теплится надежда что все с опытом разработки от года и больше. Или хотя бы те кто хоть раз пытался сохраниться на переполненную fs. Знаете, как говорят: «самый надёжный способ запомнить день рождения благоверной - это один раз о нём забыть»? ))

bugfixer ★★★★★
()
Последнее исправление: bugfixer (всего исправлений: 1)
Ответ на: комментарий от Velent

Действительно, попробовал сделать перезаписать через cp или mv - дата содания новая

У меня, если перезаписать с помощью cp, дата остается прежней. ext4.

stat -c "%w" file
cp otherfile file
stat -c "%w" file
dmitry237 ★★★
()
Ответ на: комментарий от Velent

однако он всё-же поддерживает Creation time (birth time), Modified time, Change time, Access time

Емнип - оно всё эмулируется из одного (или двух?) timestamps поддерживаемых форматом.

bugfixer ★★★★★
()
Ответ на: комментарий от intelfx

Прошу пардона, каким образом ты предлагаешься добиться того, чтобы ctime был как у источника?

А Вы таки правы - не hackish способов походу не существует. Снимаю шляпу. И «на старуху бывает проруха». ))

bugfixer ★★★★★
()
Ответ на: комментарий от intelfx

Прошу пардона, каким образом ты предлагаешься добиться того, чтобы ctime был как у источника?

Можно копировать с помощью rsync, у него есть соответствующие ключи для сохранения дат. Да и cp -p(или -a) вроде должен сохранить эти атрибуты как у источника.

Проблема же вроде сохранить дату как у TARGET была, а не как у SOURCE.

Loki13 ★★★★★
()
Последнее исправление: Loki13 (всего исправлений: 1)
Ответ на: комментарий от Loki13

Нет, ты не понял. ctime нельзя установить из юзерспейса (по крайней мере, не пользуясь отладочными интерфейсами). Ни cp, ни rsync тебе не помогут, этот таймштамп просто нельзя установить явно через futimens.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от bugfixer

на фс с CoW можно сделать и более умный вариант :)
вообще результат зависит от требований. в простом случае хватит просто файл перезаписать с нуля. коль есть подозрения нанестаб ильность железа али имеется анальный штырь «повышенной надежности» то можно и с копиями помудрить
и кстати забыл еще мелкую защиту от всего: старый файл не удаляется, а перемещается в бекап-директорию !!
и только по прошествии времени удаляется.

pfg ★★★★★
()
Ответ на: комментарий от bugfixer

Ну и пусть временный файл. Но почему обязательно копировать файл поверх? Открываешь оба(fopen) и копируешь при сохранении изменений из одного в другой(с заменой полной конечно же). Тогда дата создания как раз и сохранится.

Loki13 ★★★★★
()
Ответ на: комментарий от Loki13

Во-первых, ctime — это «change time». То, что rsync называет «create time», в Linux называется «birth time».

Во-вторых, этот ключ в Linux в любом случае не работает.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Во-вторых, этот ключ в Linux в любом случае не работает.

rsync: This rsync does not support "--crtimes" ("-N")

Да, вы правы. Этот ключ работает похоже только в винде и на маке.

Loki13 ★★★★★
()