Можете ли вы определить, был ли файл переименован?

Можете ли вы определить, был ли файл переименован?

Многие инструменты для синхронизации файлов не совсем подходят для синхронизации вашего домашнего каталога. Из-за этого, а также для изучения Ruby, я работаю над своим собственным инструментом синхронизации.

Проблема, с которой я столкнулся, которая, как я думаю, связана с моими инструментами синхронизации, заключается в том, что происходит, когда пользователь переименовывает или удаляет файл. Просто думаю о первом случае (если пользователь переименовывает его), есть ли способ, которым я могу определить, что это не новый файл, а файл, который был переименован? Может быть, уникальный идентификатор файла, о котором я не знаю. Дескрипторы файлов звучат как что-то, на что стоит обратить внимание, но я почти уверен, что это другая концепция.

решение1

Невозможно точно определить, был ли переименован файл.

Когда файл переименовывается, егоинодыномер не меняется. (Это может быть не так для «экзотических» файловых систем, таких как сетевые файловые системы, но это верно для всех «родных» файловых систем Unix.) Однако обратное неверно: если файл удален, может быть создан новый файл с тем же номером инода. Поэтому даже если вы видите, что файл имеет тот же номер инода, что и другой файл, это не обязательно означает, что файл был переименован.

Номер инода однозначно идентифицирует файл.пока он существует. Это делает его пригодным для обнаружения жестких ссылок, но не для обнаружения переименований.

Файловые дескрипторы связаны с конкретным процессом и здесь бесполезны.

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

Все инструменты, которые приходят мне на ум при переименовании файлов треков, делают это на основе содержимого файла.Унисонобнаруживает переименованные файлыесли хотя бы одна из конечных точек является удаленной. Некоторые современные системы контроля версий, такие как git, также обнаруживают переименованные файлы.

Я сильно подозреваю, что что бы вы ни хотели сделать с синхронизацией файлов, междуrsync,Унисони контроль версий, он уже существует.

решение2

Файловые дескрипторы создаются для программы, когда она открывает файл, и действительны только до тех пор, пока программа не закроет его снова. Так что, как вы и подозревали: другая концепция.

Если файл был просто переименован, то иноды не изменятся, вы можете это использовать, но если переименования не происходят часто, я сомневаюсь, что это того стоит.

Связанный контент