Вы не указали операционную систему или файловую систему, и у них разные операции, поэтому в качестве иллюстрации мы возьмем 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 копируемые ими данные и обнаруживают изменения на основе хэши - вместо этого вы можете рассмотреть эту опцию.