ディレクトリを指すシンボリック リンクがあるかどうかを確認する方法はありますか?
質問
サーバー上にいくつかのシンボリック リンクを指すフォルダーがあります。新しいフォルダーを作成したので、すべてのシンボリック リンクを新しいフォルダーを指すように変更したいと考えています。元のフォルダーを新しいフォルダーへのシンボリックリンクに置き換えることも考えましたが、このまま続けるとすぐに非常に面倒になってしまう可能性があるようです。
私が行っていることは、新しいフォルダーを指すようにシンボリックリンクを手動で変更することですが、いくつか見逃している可能性があります。
特定のフォルダーを指すシンボリックリンクがあるかどうかを確認する方法はありますか?
解決
find コマンドを使用します。
find . -lname /particular/folder
これにより、現在のディレクトリでシンボリックリンクが再帰的に検索されます。 /particular/folder
. 。絶対シンボリックリンクのみが検索されることに注意してください。同様のコマンドを使用して、「フォルダー」と呼ばれるオブジェクトを指すすべてのシンボリックリンクを検索できます。
find . -lname '*folder'
そこから、誤検知を取り除く必要があります。
他のヒント
シンボリックリンクを監査するには、 の symlinks
プログラム Mark Lord によって書かれたもの -- ファイルシステム全体をスキャンし、シンボリックリンク パスを絶対形式に正規化し、標準出力に出力します。
このようなシンボリックリンクを直接確認する方法は実際にはありません。常にマウントされていないファイルシステムがある可能性があることを考慮してください (例:外部 USB ドライブ)、システム上の別のボリュームへのシンボリックリンクが含まれる可能性があります。
次のようにして何かを行うことができます。
for a in `find / -type l`; do echo "$a -> `readlink $a`"; done | grep destfolder
FreeBSD の find
はサポートしません -lname
オプションがあるため、上記のようになりました。
find . -type l -printf '%p -> %l\n'
元のフォルダーを指すリンクがある場合、他のすべてのフォルダーを確認することは別として、それは不可能だと思います。もしそうなら、興味があります。
find / -lname 'fullyqualifiedpathoffile'
find /foldername -type l -exec ls -lad {} \;
ハードリンクの場合、「ls」オプションの 1 つを使用してディレクトリの i ノードを取得できます (-i
, 、 私は思う)。
それから、 find
と -inum
すべての一般的なハードリンクを見つけます。
ソフトリンクの場合は、次の操作が必要になる場合があります。 ls -l
すべてのファイルで「->」の後のテキストを検索し、それが絶対パスであることを確認するために正規化します。