たとえば、ファイルがありますmyold_file
。次に、次のようln
にハードリンクを作成しますmylink
。
ln myold_file mylink
次に、を使用しても、ls -a
どちらが古いのかわかりません。
とにかく伝えることがありますか?
たとえば、ファイルがありますmyold_file
。次に、次のようln
にハードリンクを作成しますmylink
。
ln myold_file mylink
次に、を使用しても、ls -a
どちらが古いのかわかりません。
とにかく伝えることがありますか?
回答:
それらは文字通り同じファイルであり、異なるパスによってのみ到達されるため、できません。最初のものには特別なステータスはありません。
.bashrc
、「相対パス.bashrc
は...を含むファイルを指します」という意味では、「...を含むファイル」と一般的に言うことを考えると、これはカテゴリーの一般的な混同であり、ファイルであるパスまたはディレクトリエントリは、それが参照するファイルを意味します。このことを理解すると、2つのハードリンクが同じファイルになる可能性があります。正式な言語を支持してその慣習を拒否することはできません。どちらのスタンスにも位置があります:
それを行うための直接的な、クリーンな(信頼できる)方法はありません。しかし、適切な状況では、これが可能になる可能性があります(少なくとも可能性があります)。問題は、ハードリンクが2つありますが、ファイルが1つしかないことです。変更、修正、および(おそらく)作成時間は、ファイル(inode)のみに保存され、ディレクトリエントリ(ハードリンク)には保存されません。したがって、必要な情報は、ファイルに関連しない操作によって簡単に破壊できる二次効果からのみ取得できます。そして、あなたはそれが破壊されたかどうかさえ見ることができません。それらを正確に認識している場合のみ、運用環境からそれを知ることができます。
ハードリンクの作成は、リンクを含むディレクトリへの書き込み操作です。したがって、ディレクトリのを更新しますmtime
。だから、もし
リンクは異なるディレクトリにあります
また、2番目のハードリンクが作成された後、これらのディレクトリのいずれも変更されていないこと(ファイルの追加、削除、名前変更、またはファイルメタデータの変更)を知っている場合mtime
は、ディレクトリのsを単純に比較できます。
特別な場合:ディレクトリの1つにmtime
ファイル(inode)の前があり、ファイルmtime
が作成されてからしばらくしてから書き込まれていないことを合理的に確認できる場合、このディレクトリのリンクは古いものです。
リンクが同じディレクトリにある場合(質問の場合に該当するようです)、さらに悪化します。その後、使用することができます
ls -lU
エントリが作成された順序の印象を得るため。新しいエントリがディレクトリリストの中央に作成されるように、エントリが削除される可能性があるため、正しい順序である必要はありません。また、Gillesが指摘したように、新しいファイルシステムではまったく機能しません。
ls -lU
トリックは最新のファイルシステム(ext4、btrfs、zfs)では機能せず、エントリは作成順に表示されません。
rm myold_file
、その後mylink
、それは同じ基本iノードを参照することも同様に良いエントリがあるとして、まだ、完全に存在し、作業でしょう。両方が削除された場合にのみ、システムはiノードを破棄できます。同じファイルを参照する2つのファイルシステムエントリを作成するためにハードリンクが使用されると、それらは同等になります。(ここでは「ファイル」は、「ディレクトリとは反対に、ファイルのデータを保持しているinodeを意味することに注意)を参照してください:。en.wikipedia.org/wiki/Inode
この質問は、ハードリンクが実際に何であるかについて(かなり合理的に)誤解されていると思います。しかし、最も正しい直接的な答えは「両方とも」だと思います。
Unixファイルシステムは通常、実際のファイルの内容とデータをiノードに保存しますが、これらはパスをまったく持たず、パスはこれらのiノードと多対1の関係を持ちます。たとえば、ボブとジョーという2つの名前で通っている人を例えます。ボブがジョーより年上である、またはその逆であると言うことはできません、彼らは同じ人の単なる名前です。
代わりにシンボリックリンクを探している「元の」ファイルと新しいファイルの概念を保持したい場合、これらはエイリアスのようなものであり、OSに対する1つのパスに対する操作の指示にすぎません。下のファイル構造を変更せずに別のものにした。(「ln -s file link」でこれらを作成できます。
上記の他のいくつかの回答の要点は、すべてのファイル名がファイルへのハードリンクであるということです。本当のオリジナルはなく、おそらく最初のものしかありません。
ディレクトリは、ファイル名とiノード番号をリストするテーブルと考えてください。
最初のリンクを含むすべてのハードリンクは、「ファイル名」をiノード番号に割り当てるディレクトリ内のエントリであるため、その名前でファイルにアクセスできます。
ファイルはディスク上のブロックのコレクションであり、inodeに保存されたメタデータによって管理および追跡されます。ファイルには1つのiノード番号があります。
ファイル名を使用してファイルのデータにアクセスするには、次の3つの手順を実行します。ファイル名をディレクトリで検索して、iノード番号を取得します。次に、iノードを参照して、データを含む関連するディスクブロックを見つけます。そして最後に、これらのブロックの読み取り/書き込みが行われます。
つまり、基本的にこれがすべてです。最初の(「オリジナル」)またはその後に作成されたハードリンクを使用してファイルコンテンツにアクセスする場合、まったく違いはありません。
ls > a; ln a b; rm a; ln b c
、どちらがもう一方より「より独創的」ですか?a
行って、あなたが残されているb
とc
...