ファイル/ディレクトリにリンクされているすべてのリンク(ハードリンクとシンボリックリンク、およびそれらの組み合わせ)を徹底的に見つけます。

ファイル/ディレクトリにリンクされているすべてのリンク(ハードリンクとシンボリックリンク、およびそれらの組み合わせ)を徹底的に見つけます。

私は(最大の移植性のために)「基本」コマンドだけを使って探したいと思います(例えば、最近の詳細を含む項目だけでなくAIX / Linux /などで動作する項目^^)みんな特定のファイル/ディレクトリを指すファイル(シンボルリンク、ハードリンク、およびそれらの組み合わせ)。

急いで答えないように注意してくださいfind / -ls | grep ....。多くを見逃すでしょう。ハードリンク、シンボリックリンク、相対パス、絶対パスを混在させる可能性については、以下のリンクを参照してください(シンボリックリンク「././././.」を使用することもできます)。

つまり

  • ハードリンクとシンボリックリンクは無限に「ネスト」することができます。
  • 一部のシンボリックリンクはフルパスであり、他のシンボリックリンクは相対パスであり得る。
  • これらのパス(相対または絶対)は非常に複雑な場合があります(例:/tmp/./././etc/file)。
  • シンボリックリンクは他のファイルにハードリンクされたファイルにつながる可能性があります。

最後に、私は「ただ」理解する方法を見つけなければなりません。ファイル/リンクの「最終目的地」とは何ですか(つまり、最終的にどのinodeにアクセスするのでしょうか?)しかし、それは本物難しさ(一部の魔法関数が「最終対象のinodeは次のようになります。...」と伝えていない限り。

私はfindの「-H」または「-L」オプションを単に使用できると思いましたが(愚かかもしれませんが…)まだ動作していません。

すべての情報を歓迎します(ただし、「Linuxでのみ利用可能な良いユーティリティ」ではなくfind / ls / etcを使用してください)。

「/tmp/A」ディレクトリへのいくつかの異なるリンクを作成し、それらのリンクをすべて見つけてリストする方法を見つけます。

mkdir /tmp/A    /tmp/B
ln -s /tmp/A/   /tmp/B/D  #absolute symlink, with a training "/"
ln -s ../A      /tmp/B/E     #relative symlink
ln -s /tmp/A/.  /home/F  #absolute symlink, with a trailing "/."
ln -s ../tmp/A/./.  /var/L  #let's get craaaaaaazy! symlinks are "fun"...
ln    /tmp/B/D  /etc/G    #Hard-link to the symlink file /tmp/B/D, which itself symlink to /tmp/A/ witch ends up being the same as "/tmp/A" in most cases.
ln    /etc/G    /etc/G2   #and a duplicate of the previous one, just to be sure [so /etc/G, /etc/G2, and /tmp/B/D have same inode, but it's a different inode from the final destination... :(
ln -s etc/G /thatsenough   #symlink again, for further chaining

それからいくつか試してみてください。

find -H / -ls   # show inodes of the links and symlinks, not of the "final" directory
find -L / -ls   # same thing (I do try that on an OLD AIX ...)
find -H / -inum 123456 -ls  #if /tmp/A/. has inode 123456. This lists *only* hardlinks to /tmp/A, ie will only print a subset (and /tmp/A have to be a file in that case)

呼び出しの1つでは、すべてのパスの前に最後のinode(123456)が表示されると予想していましたが(両方に「-follow」も追加しました)、常に「最終ターゲット」「インデックスノード」の代わりに接続されたinodeが表示されます(例:/ tmp/A)

私が最後に訪問した「最終インデックスノード」を見つけるために何を使用できますか? [オペレーティングシステムが管理しますが、「簡単な」コマンドで」を介して事前に通知できます。それあなたが開くファイルそれ最後のインデックスノード! 「?]

ベストアンサー1

この質問に対する単一の回答はありません。たとえば、ツリー内の複数のシンボリックリンクをリンクすると、同じインデックスノードで解決される無限の数のパスを作成できます。

完全な移植性に対するあなたの欲求も成功する可能性が低いです。たとえば、「検索」でさえも、GNU、BSD、POSIX、およびその他のバリエーションの間(もちろん、そのバリアントのバージョン間でも)大きく異なります。

しかし、あなたが望むものはおそらくfind / -samefile /absolute/path/to/file

これはGNU find> = 4.2.11で利用可能です。

おすすめ記事