В Linux (в настоящее время используется файловая система ext4), как можно быстро проверить, было ли изменено содержимое файла, не читая его содержимого?
Является ли stat
команда рекомендуемым подходом? Я сейчас делаю
$ stat --format "%Y" hello.txt
и позже я могу проверить, дает ли та же команда тот же вывод. Если это так, я делаю вывод, что hello.txt не изменился.
Я чувствую, что хочется добавить больше параметров, чтобы быть еще более уверенным. Например, добавит ли размер файла, имя файла и т. Д. Еще лучший «отпечаток» файла?
По этой теме я вспоминаю, что том TrueCrypt, который я когда-то имел, всегда игнорировался моей программой инкрементного резервного копирования, возможно потому, что TrueCrypt следил за тем, чтобы не оставлять никаких изменений метаданных. Я полагаю, что действительно возможно изменить все данные, возвращаемые stat
, следовательно, не может быть гарантировано, что он подхватит все возможные модификации файла?
источник
md5sum filename
?md5sum
или любой вид контрольной суммы читает содержимое файла. Я не хочу этого делать, потому что это слишком медленно для моих целей.ls -t
отсортирует содержимое в каталоге по времени модификации.Ответы:
Если вы хотите определить, был ли файл изменен обычным способом (редактирование его в каком-либо приложении, извлечение новой версии из систем контроля версий, перестройка и т. Д.), Проверьте, изменилось ли время его модификации (mtime) с последняя проверка. Вот что
stat -c %Y
сообщает.Время модификации может быть установлено
touch
командой. Если вы хотите определить, был ли файл каким-либо образом изменен (включая использованиеtouch
, извлечение архива и т. Д.), Проверьте, изменилось ли время его изменения inode ( ctime ) с момента последней проверки. Вот чтоstat -c %Z
сообщает. Ctime не может быть подделано, кроме как системным администратором (и даже тогда, только косвенными способами: путем изменения системных часов или путем прямого доступа к диску, минуя файловую систему).источник
Команда stat имеет разрешение всего в секунду. Таким образом, если файл был изменен дважды в одну и ту же секунду, вы можете пропустить изменение. Более новые файловые системы, такие как ext4, предоставляют метки времени с более высоким разрешением в наносекундах, но некоторые из старых инструментов еще не догнали.
Кроме того, другие программы могут устанавливать произвольное время изменения. Вы можете увидеть, как это может произойти с помощью сенсорной команды.
Если вас беспокоит какая-либо из этих двух возможностей, было бы неплохо взглянуть и на размер файла. Это то, что делает rsync, когда ищет измененные файлы.
источник
То, что у вас есть, это правильный метод. Единственная причина для этого может быть, если файловая система не обновляется должным образом - в этом случае вы столкнетесь с целой кучей более серьезных проблем.
Конечно, я предполагаю, что кто-то, обладающий необходимыми знаниями и корневым доступом к системе, в которой доступен раздел, может изменить информацию, чтобы она выглядела так, как будто файл не был изменен. Однако в этом случае они наверняка сделали бы то же самое с размером и т. Д.
источник
Я делаю отпечаток пальца более подробно.
Я сделал небольшую функцию-обертку, которая генерирует одинаковый вывод для версий MacOS / BSD и GNU
stat
(также обнаруживает версию, установленную Homebrew сg
префиксом).init
Функция вызывается один раз во время инициализации скрипта иgetFileStatus
может быть вызвана повторно без накладных обнаружения.источник