Какие операции должны изменить дату модификации каталога? - PullRequest
1 голос
/ 03 мая 2020

Я программирую инструмент, который может создавать резервные копии или объединять каталоги.

Дата модификации файлов довольно проста, но как насчет даты модификации каталога?

Какие операции выполняются рассматривается модификация каталога? (Я бы тогда вызвал API операционной системы для этого.)

Чем отличается семанти c для разных операционных систем и файловых систем? Постоянно ли он обновляется обычными сторонними программами?

Зависит ли обычная сторонняя программа от определенного семанти c даты модификации каталога? (Пример: программы инкрементного резервного копирования восстанавливаются в каталогах с одинаковой датой изменения?)

Добавление:

Вот еще один пример (хотя я бы предпочел более широкую область действия): Когда я копирую каталог с одного диска на другой: на самом деле происходит то, что сначала создается внешний каталог, а затем рекурсивно до отдельных добавляемых файлов. Последняя запись любого добавляемого каталога по умолчанию изменит дату модификации этого каталога. В результате каждый каталог будет иметь совершенно новую дату модификации, которая будет иметь небольшую информационную ценность (и будет отличаться от таковой в исходных каталогах). Один вопрос состоит в том, хотим ли мы, чтобы это имело место, или мы хотим затем изменить дату модификации этого каталога, чтобы она была такой же, как и у каталога на диске-источнике.

Ответы [ 2 ]

1 голос
/ 11 мая 2020

Вы не указали операционную систему или файловую систему, и у них разные операции, поэтому в качестве иллюстрации мы возьмем POSIX , а к «времени модификации» примем обсуждение примерно mtime (в отличие от ctime).

POSIX происходит из Unix, где, как сказал @itisravi, каталог - это просто другой тип файла.

Это означает 2 вещи:

  • Каждый системный вызов, который изменяет mtime файла и может вызываться в каталоге, может изменять mtime каталога.
  • Каждый системный вызов, который изменяет содержимое данных inode каталога, а именно список имен файлов или номер индекса, связанный с именем файла в списке, изменит каталог mtime.

В первой категории у нас есть utime(2) и это варианты, такие как futimens(2).

Во второй категории у нас есть creat(2), open(2) с O_CREAT, mkdir(2), mkfifo(2), * 1 037 *, bind(2) до доменного сокета unix, rename(2), link(2), symlink(2), unlink(2), rmdir(2) и их варианты.

Все эти ссылки на spe c имеют соответствующий раздел, в котором говорится, когда они должны обновить mtime.

Что они не имеют, так это любая спецификация о том, когда mtime должен не измениться. Это означает, что файловой системе по существу разрешено изменять mtime в любое время по своему усмотрению. Почему такая вещь? Вот несколько примеров:

  • Фоновые задачи, например, удаление старых файлов.
  • Администратор восстанавливает файловую систему до более старого снимка.
  • Проблемы с реализацией при оптимизации или исправлении ошибок в фон не может быть эффективно выполнен без обновления mtime.
  • глупое переименование NFS (но учтите, что NFS не совместима с POSIX).

Однако, в контексте инструмента, который вы пишете (клон rsync(1)?), существуют другие соображения:

  • Метаданные имеют значение. Если кто-то заблокировал файл в каталоге, он не изменит время модификации каталога, но вам все равно нужно спуститься в каталог и что-то там сделать.
  • Некоторые инструменты, например cp -a или Caja по умолчанию копирует метаданные при копировании данных. Метаданные исходных данных действительно гораздо более полезны, чем метаданные вновь создаваемых данных.
  • Когда вы объединяете каталоги, вам необходимо принять непротиворечивое определение того, что будет установлено для mtime. Вероятно, «последний из двух каталогов» является наиболее общеприменимым определением.
  • Помимо инструментов резервного копирования, таких как rsyn c, которые похожи на то, что вы делаете, есть еще одно семейство инструментов, заинтересованных в обнаружении изменений. - инструменты для сборки. Такие инструменты, как make(1) также учитывают время изменения , но это "старый способ", более новые инструменты сборки имеют sh копируемые ими данные и обнаруживают изменения на основе хэши - вместо этого вы можете рассмотреть эту опцию.
0 голосов
/ 06 мая 2020

Очевидно, что вы понимаете, что каталоги тоже являются файлами, поэтому все, что изменяет содержимое каталога, обновит время его модификации. Поскольку содержимое каталога является именами файлов, практически любая операция ввода (create, mkdir, rmdir, unlink et c.) Внутри каталога будет обновлять его mtime. Вы также можете вручную установить atime и mtime с помощью системного вызова utime(2).

Все это верно для файловых систем на Linux и различных Unix вариантов операционной системы.

...