web-dev-qa-db-ja.com

ハードリンクが作成された場合にどのファイルがオリジナルかを見分ける方法

たとえば、ファイルmyold_file。次に、lnを使用して、ハードリンクをmylinkとして作成します。

ln myold_file mylink

次に、ls -a、どちらが古いのかわかりません。

とにかく言うことはありますか?

34
BufBills

それらは文字通り同じファイルであり、異なるパスでのみ到達するため、できません。最初のものには特別なステータスはありません。

95
Jenny D

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

ハードリンクの作成は、リンクを含むディレクトリへの書き込み操作です。したがって、ディレクトリのmtimeを更新します。つまりif

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

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

特殊なケース:ディレクトリの1つにファイル(inode)の前にmtimeがあり、mtimeがあり、ファイルが作成されてからすぐに書き込まれていないことが合理的に確認できる場合このディレクトリのリンクは古いものです。

リンクが同じディレクトリにある場合(これは質問のケースのようです)、状況はさらに悪化します。その後、使用できます

ls -lU

エントリが作成された順序の印象を得るために。新しいエントリがディレクトリリストの中央に作成されるようにエントリが削除される可能性があるため、これは正しい順序である必要はありません。そして、Gillesが指摘したように、新しいファイルシステムではまったく機能しません。

16
Hauke Laging

ディレクトリの最終変更時刻に依存していて、それらのディレクトリがいつどのように変更されるかについての知識がない場合、mtimeに依存すると、時間の一部が間違っていることになります。ここでの問題は、ファイルがディレクトリエントリではなく、iノードによってファイルシステムで表されることです。ディレクトリエントリ(ファイル名)は、ファイルではなくiノードを指しています。

古いディレクトリエントリを知る必要がある理由と、それを知る必要がないようにする方法について、私はおへそをしていると思います。

10
Melinda

この質問は、ハードリンクが実際に何であるかについて(かなり合理的に)誤解されていると思います。しかし、最も正しい直接的な答えは'They both are'だと思います。

Unixファイルシステムは通常、実際のファイルの内容とデータをiノードに格納します。これらにはパスがありません。パスはこれらのiノードと多対1の関係にあります。アナロジーとして、ボブとジョーという2つの名前を使用する人を考えてみましょう。ボブがジョーより古い、またはその逆であるとは言えません。それらは同じ人物の名前にすぎません。

「元の」ファイルの概念とシンボリックリンクを探している新しいファイルの概念を保持したい場合、これらはエイリアスであり、1つのパスに対して操作する必要があるかのようにOSに指示するだけです。下のファイル構造を変更せずに別のものになりました。 (これらは「ln -s file link」で作成できます。

8
Vality

上記の他のいくつかによって与えられた答えの核心は、すべてのファイル名がファイルへのハードリンクであるということです。本当のオリジナルはなく、たぶん最初のものです。

ディレクトリは、ファイル名とiノード番号をリストするテーブルと考えてください。

最初のリンクを含むすべてのハードリンクは、iノード番号に「ファイル名」を割り当てるディレクトリ内のエントリなので、その名前でファイルにアクセスできます。

ファイルはディスク上のブロックのコレクションであり、iノードに格納されたメタデータによって管理および追跡されます。ファイルには1つのiノード番号があります。

ファイル名を介してファイルのデータにアクセスすることは、3つのステップのプロセスです。ファイル名は、iノード番号を取得するためにディレクトリで検索されます。次に、iノードを参照して、データを含む関連するディスクブロックを見つけます。次に、最後にそれらのブロックが読み書きされます。

つまり、基本的にはこれだけのことです。最初の(「元の」)リンクを使用してファイルの内容にアクセスしても、その後に作成されるハードリンクを使用しても、まったく違いはありません。

2
Johan