ハードリンクが作成された場合に元のファイルを確認する方法


34

たとえば、ファイルがありますmyold_file。次に、次のようlnにハードリンクを作成しますmylink

ln myold_file mylink

次に、を使用しても、ls -aどちらが古いのかわかりません。

とにかく伝えることがありますか?


2
反論:もしあなたがそうするならls > a; ln a b; rm a; ln b c、どちらがもう一方より「より独創的」ですか?a行って、あなたが残されているbc...
glglgl

2
何を達成しようとしていますか?何を達成しようとしていますか?そのような「オリジナル」はありません。ファイルは、メタデータを含むiノードと、データを含むブロックのコレクションです。ディレクトリにはファイルへのリンクを含めることができ、このリンクはファイル名とiノード番号です。ファイルへのリンクはいくつでも作成できます。ファイルにリンクが1つ未満になることはありません。
ヨハン14

この質問の受け入れられた答えの詳細な説明:その質問の受け入れられた答えを参照してください。
Utku

回答:


93

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


4
これは明らかに正しい答えです。OPの質問は誤解に基づいています。
ダニエル・アーウィッカー14年

8
@Adnan実際、いいえ:2つのハードリンクは同じファイルです。それらは異なるディレクトリエントリです。ジェニーDの用語は正しい。
ジル 'SO-悪であるのをやめる' 14年

1
@Gillesどのように正しいのかわかりません。2つのハードリンクは2つのファイルではありません。ハードリンクはファイルではありません。それらは、同じファイル(ディスク上の物理的な場所)を指すため、リンクします。「2つのハードリンクは文字通り同じファイルである」と言うのは間違っています。
アディ14年

1
@JennyDそして、それは私が「ハードリンク」が使用されていると聞いた唯一の方法です。iノードへのファイルシステムポインター。まあ、私たちはすべて間違っていると思います。これは無意味なので、これについて議論するのをやめます。あなたの答えは私にとって正しいようです、あなたは私から+1を持っています、そして私はそれをそのままにします。
アディ14年

5
ハードリンクがファイルであると言うことは、異なるカテゴリのものを比較することであり、技術的には正しくありません。しかし.bashrc、「相対パス.bashrcは...を含むファイルを指します」という意味では、「...を含むファイル」と一般的に言うことを考えると、これはカテゴリーの一般的な混同であり、ファイルであるパスまたはディレクトリエントリは、それが参照するファイルを意味します。このことを理解すると、2つのハードリンクが同じファイルになる可能性があります。正式な言語を支持してその慣習を拒否することはできません。どちらのスタンスにも位置があります:
スティーブジェソップ

16

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

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

  1. リンクは異なるディレクトリにあります

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

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

リンクが同じディレクトリにある場合(質問の場合に該当するようです)、さらに悪化します。その後、使用することができます

ls -lU

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


2
selinux、監査証跡、またはファイルシステムジャーナルのスパイについての言及はありませんか?smirk監査証跡がなければ、知る方法はありません。計算された推測
リッキービーム14年

1
@mikeservこの方法で他の人に教えたいなら、少なくとも正しく引用することを学ぶべきです。質問では「どのファイル」と言いませ。そして、たとえそれが行われたとしても、これは単なる言葉遣いの問題であり、質問を理解するために脳を投げることは、それが本当に何であるかを容易に明らかにするでしょう。
ホークレイジング14年

4
ディレクトリmtimeトリックは、状況が適切な場合に機能します(まれです)。しかし、あなたがそれを提示している方法では、時には反対の結論に達するでしょう。ディレクトリmtimeは、ファイルのctimeと等しい場合にのみ価値のある指標です。しかし、このls -lUトリックは最新のファイルシステム(ext4、btrfs、zfs)では機能せず、エントリは作成順に表示されません。
ジル 'SO-悪であるのをやめる' 14年

2
@mikeserv-OPの質問は誤解に基づいています。彼らがした場合はrm myold_file、その後mylink、それは同じ基本iノードを参照することも同様に良いエントリがあるとして、まだ、完全に存在し、作業でしょう。両方が削除された場合にのみ、システムはiノードを破棄できます。同じファイルを参照する2つのファイルシステムエントリを作成するためにハードリンクが使用されると、それらは同等になります。(ここでは「ファイル」は、「ディレクトリとは反対に、ファイルのデータを保持しているinodeを意味することに注意)を参照してください:。en.wikipedia.org/wiki/Inode
ダニエルエリカー

1
-1。なぜなら、テーブルを更新するときに一部のファイルシステムでディレクトリがどのように変化するかに関する情報ですが、この答えは、「元のファイル」は複数のハードリンクの場合はプロパティではないという質問に存在する誤解の解消に失敗するためです単一のiノードに。その意味では、逸話的に興味深いものの、この質問に着くほとんどの人がハードリンクの基本概念について学ぶべきではありません。この問題は「それを行うための直接的なクリーンな方法」の欠如ではなく、問題はそもそも「それ」がないということです。
カレブ14

10

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

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


8

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

Unixファイルシステムは通常、実際のファイルの内容とデータをiノードに保存しますが、これらはパスをまったく持たず、パスはこれらのiノードと多対1の関係を持ちます。たとえば、ボブとジョーという2つの名前で通っている人を例えます。ボブがジョーより年上である、またはその逆であると言うことはできません、彼らは同じ人の単なる名前です。

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


ボブ/ジョーは自分の年齢について本当に敏感になることがあります...ハード/ソフトリンクの比較は良いものです-特にハードリンクがディレクトリファイルにエントリを追加するだけだと考える場合-既存のものiノード-しかし、ソフトリンクはそれ自体がファイルであるため、独自のiノードが割り当てられます。それでも、どちらの場合でも、変更時間はリンクされたファイルにのみ関係します。重要なリンクに実行できる変更は作成/削除だけであるためです。
mikeserv 14

2

上記の他のいくつかの回答の要点は、すべてのファイル名がファイルへのハードリンクであるということです。本当のオリジナルはなく、おそらく最初のものしかありません。

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

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

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

ファイル名を使用してファイルのデータにアクセスするには、次の3つの手順を実行します。ファイル名をディレクトリで検索して、iノード番号を取得します。次に、iノードを参照して、データを含む関連するディスクブロックを見つけます。そして最後に、これらのブロックの読み取り/書き込みが行われます。

つまり、基本的にこれがすべてです。最初の(「オリジナル」)またはその後に作成されたハードリンクを使用してファイルコンテンツにアクセスする場合、まったく違いはありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.