93767


表題の通り、Linux（CentOS)を利用しておりますが、あるディレクトリに対して、シンボリックリンクの参照先となっているかどうか確認する方法はございますか？  
  
`/usr/local/` の配下にopenjdkを下記のように配置しております。

[code]

    jdk -> /usr/local/jdk-19.0.2
    jdk-19
    jdk-19.0.1
    jdk-19.0.2
    
[/code]

PATH には `/usr/local/jdk` を設定して、Javaを利用するプログラムには、バージョンを気にしないようにしております。

古いバージョンのフォルダを定期的に削除しておりますが、いざ削除しようとしたとき、本当に削除して問題はないのか？と思うようになりました。  
環境自体共用のサーバなので、自分以外の者が、勝手にjdk-19のJDKを見るようなプログラムを実装する可能性もあります。

ルート(`/`)からシンボリックリンクを探して確認すればよいのですが、もっと簡単な方法はないのでしょうか？  
ご存じの方いらっしゃいましたらアイデアをいただければと思います。  


CC BY-SA 4.0
2023-02-08T03:34:58.140
93759
2023-02-09T01:56:40.087
2023-02-09T01:56:40.087
3060
48734
question
linux
Linuxでシンボリックリンクの参照先となっているかどうかを確認する方法はありますか？


シンボリックリンクには参照先情報はあるけど, 「どこから参照されている」の情報はありません  
なので, (例えば)以下のようなコマンドを用いキャッシュしておき, 必要に応じて検索するとよいかも

  * $ `find /usr/local/ -type l`
  * $ `ls -lR /usr/local/ | grep ^l`

ハードリンクという手もあります  
ハードリンクを作成するのであれば, 複数存在するかどうかは少なくともわかります (`ls -l` とかで)


CC BY-SA 4.0
2023-02-08T08:51:37.950
93767
2023-02-08T08:51:37.950
43025
93759
answer


oririさんの回答にあるように、シンボリックリンクの参照元の情報はファイルシステム上で管理されていないです。

Linux環境であればreadlink(1)を使うと、シンボリックリンクを再帰的にたどって末端のファイルを見つけることができるようです。

[code]

    find / -type l  -print -exec readlink -f {} \; | paste - -
    
[/code]

例えば以上を実行するとシンボリックリンクのファイルと末端のファイルのペアを表示できるので、grepで絞り込めば、調べたいファイルを直接または間接的にシンボリックリンクしているファイルが見つかると思います。


CC BY-SA 4.0
2023-02-08T09:11:37.430
93768
2023-02-08T09:11:37.430
35558
93759
answer


GNU find コマンドの `-samefile` オプションを利用する場合。  
※ root directory から探索すると時間が掛かる場合がありますので、可能であれば探索開始ディレクトリを限定するか、`-xdev` オプションや
`-fstype` オプションなどを付ける方がよいでしょう。

[code]

    $ cd /tmp
    $ touch foo
    $ (cd /var/tmp && ln -s ../../tmp/foo .; ls -l foo)
    lrwxrwxrwx 1 nemo nemo 13 Feb  8 18:45 foo -> ../../tmp/foo
    
    $ find --version
    find (GNU findutils) 4.8.0
    
    $ find -L / -xdev -samefile /tmp/foo 2>/dev/null
    /var/tmp/foo
    /tmp/foo
    
[/code]


CC BY-SA 4.0
2023-02-08T10:03:46.860
93770
2023-02-08T10:03:46.860
47127
93759
answer