ハードリンクが作成されたときにどのファイルがソースであるかを確認する方法

ハードリンクが作成されたときにどのファイルがソースであるかを確認する方法

たとえば、ファイルがあります。その後、ハードリンクを作成するmyold_fileために使用します。lnmylink

ln myold_file mylink

そうすれば、useを使ってもls -aどちらが古いのかわかりません。

言うことがありますか?

答え1

実際には同じファイルなので、別のパスを介して到達できません。最初は特別な地位がありません。

答え2

これを行う直接的でクリーンな(信頼できる)方法はありません。ただし、適切な状況では可能です(または少なくとも可能です)。問題は2つのハードリンクがありますが、ファイルは1つだけです。ファイル(inode)の変更、変更、および(おそらく)作成時間のみが保存され、ディレクトリエントリ(ハードリンク)は保存されません。したがって、必要な情報は2次効果を介してのみ取得できます。これはファイルとは無関係の操作によって簡単に破壊される可能性があります。そしてそれが破壊されたかさえ見ることができません。これは、あなたの操作の正確な図を持っている場合にのみ知ることができます。

リンクを含むディレクトリへの書き込み操作によってハードリンクが作成されます。だからディレクトリのmtimeもし

  1. リンクは別のディレクトリにあります

  2. そして、2番目のハードリンクが作成されてからこれらのディレクトリのどれも変更されていないこと(ファイルの追加、削除、名前変更、またはファイルメタデータの変更)を知っている場合は、mtimeディレクトリを比較するだけです。

特別な場合:ディレクトリの1つがファイルmtime(inode)の前に1つあり、ファイルがmtime作成された直後にファイルが記録されたと合理的に確信できる場合、そのディレクトリへのリンクは前のリンクです。

リンクが同じディレクトリにある場合、状況はさらに悪化します(あなたの質問に当てはまるようです)。その後利用できます

ls -lU

アイテムが生成される順序を理解します。ディレクトリリストの途中で新しいエントリを作成するためにエントリが削除される可能性があるため、これは必ずしも正しい順序ではありません。 Gilesが指摘したように、最新のファイルシステムでは機能しません。

答え3

ディレクトリの最後の変更時間に依存し、そのディレクトリがいつどのように変更されるかわからない場合、mtimeに依存すると、一定の割合の時間に問題が発生します。ここでの問題は、ファイルがディレクトリエントリではなくinodeとしてファイルシステムに表示されることです。ディレクトリエントリ(ファイル名)は、ファイルではなくinodeを指します。

どのディレクトリエントリがより古いかを知る必要がある理由と、それを知る必要を避ける方法を考えてみましょう。

答え4

上記の他の多くの人が提供した答えの鍵は、各ファイル名がファイルへのハードリンクであることです。実際には独創的なものではなく、おそらく最初のものでしょう。

ディレクトリをファイル名と inode 番号がリストされたテーブルと考えてください。

各ハードリンク(最初のリンクを含む)は、その名前でファイルにアクセスできるように、inode番号に「ファイル名」を割り当てるディレクトリのエントリです。

ファイルはディスクのブロックの集まりで、inodeに保存されたメタデータで管理および追跡されます。ファイルにはinode番号があります。

ファイル名でファイルデータにアクセスするのは3段階のプロセスです。ディレクトリからファイル名を検索してinode番号を取得します。次に、inodeを参照して、データを含む関連ディスクブロックを見つけます。最後に、これらのブロックを読み書きします。

したがって、これらすべての基本的に重要な点は次のとおりです。最初の(「オリジナル」)ハードリンクを使用したり、後で作成されたハードリンクを使用してファイルの内容にアクセスすることには全く違いはありません。

関連情報