ディレクトリツリー内のすべての絶対リンクを検索する


8

相対ではなく絶対的にターゲットを識別するディレクトリ内のすべてのシンボリックリンクを(再帰的に)検出するにはどうすればよいですか?

これらのリンクは、ディレクトリツリー全体を移動すると壊れる可能性が非常に高いので、それらを識別する方法が必要です。

ディレクトリツリーを移動した場合(たまたまディレクトリツリーのルートの外を指している場合)は、相対リンクでも壊れる可能性がありますが、この問題この質問で対処されていると思います。


回答:


15

絶対リンクを見つけるには、サポートされている場合はfind-lnameオプションを使用できますfind(少なくともGNU findで、FreeBSDとmacOS で利用可能です)。

find . -type l -lname '/*'

これはfind、シンボリックリンクであり、/*シェルグロビングを使用して内容(ターゲット)が一致するファイルの名前を出力するように要求します。

厳密に言うと、POSIXは絶対パス名が1つ/または3つ以上で始まることを指定してい/ます。それに合わせて、あなたは使うことができます

find . -lname '/*' ! -lname '//*' -o -lname '///*'

// foo / barが/ foo / barと異なるのはどのシステムですか?詳細については、

(GNU固有であることを指摘してくれたSato Katsuraに感謝します。少なくともFreeBSDとmacOSでも実際に利用可能であると述べてfd0感謝し、POSIX絶対パス名の定義を提示してくれたStéphaneChazelasに感謝します。)-lname


私は投稿しようとしていました。find ./ -t l -exec ls -l {} \;これは安全な代替手段になるはずです。その出力を解析して、必要なことを何でも行うのは簡単です。
Centimane 2016


7

このsymlinksユーティリティは便利です。

$ symlinks -r .
other_fs: /home/chazelas/test/bin -> /bin
dangling: /home/chazelas/test/DIR/foo -> foo
dangling: /home/chazelas/test/blah -> not-here
absolute: /home/chazelas/test/chazelas -> /home/chazelas

そしてあなたのためにリンクを修正することができます。ここで-tそれ何をするかを伝えるために:

$ symlinks -rct .
other_fs: /home/chazelas/test/bin -> /bin
dangling: /home/chazelas/test/DIR/foo -> foo
dangling: /home/chazelas/test/blah -> not-here
absolute: /home/chazelas/test/chazelas -> /home/chazelas
changed:  /home/chazelas/test/chazelas -> ../../chazelas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.