ファイルの名前が変更されたかどうかわかりますか?

ファイルの名前が変更されたかどうかわかりますか?

ファイルを同期するためのツールの多くは、ホーム ディレクトリを同期するのに適していません。このため、また Ruby を学ぶために、私は独自の同期ツールの開発に取り組んできました。

私が遭遇した問題は、同期ツールにあると思いますが、ユーザーがファイルの名前を変更したり、ファイルを削除したりしたときに何が起こるかということです。最初のケース (ユーザーが名前を変更した場合) について考えると、これが新しいファイルではなく、名前が変更されたファイルであることがわかる方法はありますか? おそらく、私が知らないファイルの一意の ID でしょう。ファイル記述子は調べるべきもののように思えますが、それは別の概念であることは間違いありません。

答え1

ファイル名が変更されたかどうかを確実に確認する方法はありません。

ファイル名が変更されると、iノード番号は変更されません。(これは、ネットワーク ファイル システムなどの「エキゾチック」なファイル システムでは当てはまらないかもしれませんが、すべての「ネイティブ」な Unix ファイル システムでは当てはまります。) ただし、逆は当てはまりません。ファイルが削除された場合、同じ inode 番号を持つ新しいファイルが作成されることがあります。したがって、あるファイルに、以前別のファイルと同じ inode 番号が付いている場合でも、必ずしもファイルの名前が変更されたことを意味するわけではありません。

inode番号はファイルを一意に識別します存在する限りそのため、ハードリンクの検出には適していますが、名前の変更の検出には適していません。

ファイル記述子は特定のプロセスに関連付けられており、ここでは役に立ちません。

ファイルのサイズ、変更時刻、および inode 番号が以前と同じで、名前が異なる場合は、名前が変更されたことを意味するというヒューリスティックを検討できます。このヒューリスティックは、多くの同期ツールが変更されていないファイルを検出するときに行う、同じ名前、サイズ、および変更時刻を検出する方法に似ています。

ファイル名の変更を追跡するツールは、ファイルの内容に基づいて名前の変更を行うものと考えます。ユニゾン名前が変更されたファイルを検出します少なくとも1つのエンドポイントがリモートの場合git などの最新のバージョン管理システムでは、名前が変更されたファイルも検出されます。

ファイル同期で何をしたいとしても、rsyncユニゾンバージョン管理はすでに存在しています。

答え2

ファイル記述子は、プログラムがファイルを開いたときに作成され、プログラムが再度ファイルを閉じるまで有効です。したがって、ご想像のとおり、異なる概念です。

ファイルの名前が変更されただけであれば、i ノードは変更されないので、これを使用できますが、名前の変更が頻繁に行われない限り、その価値はないと思われます。

関連情報