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

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

私は(最大の移植性のために)「基本」コマンドだけを使って探したいと思います(例えば、最近の詳細を含む項目だけでなく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で利用可能です。

答え2

ls-Lシンボリックリンクを効率的に追跡し、エンドオブジェクトの権限、所有者、inodeなどを表示するオプションがあります。 [stat(target)代わりに]を実行してlstat(target)これを行います。最良の結果を得るには、rootとして実行するか、関連するマウントされたファイルシステムへの読み取りアクセス権を持つユーザーとして実行します。

あなたの場合は、以下を試してください。

find / -exec ls -iLd {} | grep inodenum

[OPのリクエストに応じて私のコメントからコピーされました。 ]

答え3

修正する:Mark Plottnickの答え(私の質問の下)ははるかに簡単で、ファイルとディレクトリで動作し、間のリンクの組み合わせに沿って最終的なターゲットのinodeを提供します!
これが私が探しているものです。 【テストディレクトリで特別なケースを忘れない限り】
最終的な解決策は非常にエレガントで移植性に優れているので、本当に嬉しいです!マーク、私がダニを与えることができるように投稿してください^^

以下に私だけの解決策を提示しましたが、次のようになります。非常に馬鹿^^

===

ターゲットファイルがディレクトリの場合、いくつかの非常に簡単な解決策が見つかりました! 「/」を追加するだけです。名前の後には、最終目的地のディレクトリinodeが表示されます!そしてまだ元のパスを印刷します!

find / -print | xargs -n 1 ls -ild '{}'/. 2>/dev/null | grep inodeyouwant

注:「シンボリックリンクかハードリンクなのかわからないままファイルでこれを実行しようとしています」の内容は非常に面倒なので、ハードリンクとシンボリックリンクのあるファイルのみを見つけるように更新します。

ただし、「最終的にディレクトリで起動しない」ファイル(つまり、最終的にディレクトリではないことを指すリンク/シンボリックリンク/チェーン)に対してこれを行う方法を見つける必要があります(再度、最終的なターゲットを変更しないでください)せず!)。

良い方法が見つかったら更新します

答え4

GNUの使用find:

find -L . \( ! -xtype l -o -prune \) -samefile /path/to/the/file -print

同じファイルにリンクされているさまざまな標準パスが報告されます。/path/to/the/file

そしてzsh

printf '%s\n' **/*(De:'[[ $REPLY -ef /path/to/the/file ]]')

まだPOSIXではありませんが、[ file -ef other-file ]広くサポートされています仕様の次のバージョンに含まれるものについて話してください。

find . -exec sh -c '
  for file do
    [ "$file" -ef /path/to/the/file ] && printf "%s\n" "$file"
  done' sh {} +

shAT&T kshpdkshbashzshashまたは少なくとも動作する必要があります(これに基づいていないyashPOSIX実装はわかりません)。sh

関連情報