特定のディレクトリ内のファイル/ディレクトリを指すすべてのシンボリックリンクを見つける方法

特定のディレクトリ内のファイル/ディレクトリを指すすべてのシンボリックリンクを見つける方法

この問題についてまたはこれに(たとえば)特定のディレクトリ(と呼びます/dir1)を指すシンボリックリンクを見つける方法の解決策を得ることができますが、私は/dir1

このようなディレクトリを削除したいのですが、別のディレクトリ(と呼びます/dir2)に/dir1

また、絶対パスまたは相対パスを使用してこれらのシンボリックリンクを作成した可能性があります。私の唯一の助けは、私が確認したいシンボリックリンクがマウントされたファイルシステムにあることを知ることです/dir2

答え1

以下を使用して、すべてのシンボリックリンクを見つけることができます。

find / -type l 

ディスク上の各場所にアクセスするには、rootとして実行する必要があるかもしれません。

これを拡張してリンクへのフルパスを取得し、削除したいターゲットディレクトリにそれらを出力できる必要readlink -fがあります。grep

find / -type l -exec readlink -f {} + | grep -F /dir2

find / -type l -printf '%l\n'取得する相対リンクがターゲット../tmp/xyzディレクトリを指す可能性がありますが、完全に拡張されていないため一致しないため、使用すると機能しません。

答え2

私の場合、許可された答えは機能しませんでした(リンクソースが出力されていないため)。これは私にとって効果的です。

私は2つの節を使ってこの問題を解決しました-exec

find /home/ -type l -exec readlink -nf {} ';' -exec echo " <- {}" ';' | grep "/dir2"

答え3

そしてzsh

print -rC1 /dir2/**/*(ND@e['[[ $REPLY:P = /dir1(/*|) ]]'])

分割:

  • print -rC1:列に対応するパラメータrawを印刷します1 C。ここで、パラメータは次のglobで生成されたパラメータです。ls -ld各シンボリックリンクに関する詳細情報を取得するには、次のように置き換えます。
  • **/:すべてのレベルのサブディレクトリ(再帰的ワイルドカード)
  • *:任意の名前のファイル(*ほとんどのシェルと同様に、zshも文字ではなく文字も受け入れますが、任意の文字で構成されています)
  • (...):glob修飾子は、ファイル名だけでなく、他の基準と一致するかどうかをさらに修飾します。
  • Nnullglobこのglobを有効にします(一致する項目がなくても失敗しません。空のリストを渡してもprint何も印刷されません)。
  • D:enabled dotglob: 隠しファイルも考慮してください。
  • @: ファイル形式の制限シンボリックリンク
  • e['code']:評価結果がtrueのファイルを選択しますcode。内部では、code検討中のファイルが$REPLY
  • $REPLY:P:ファイルへの絶対パスと標準(非記号リンク)パスを取得します(realpath()標準関数の機能に似ています)。
  • [[ string = pattern ]]文字列がパターン(ksh)と一致する場合はtrueを返します。
  • /dir1(/*|)単独で、または次のパターンで/dir1一致します。/dir1/

¹ 一致するファイルがない場合は、現在の作業ディレクトリが一覧表示されます。 glob修飾子をls削除することをお勧めします。N

答え4

場合によっては、次を使用してディレクトリを削除した後に、結果として生じる誤ったシンボリックリンクを削除できます。

find -xtype l -delete

シンボリックリンクが切断されると、xtype テストは「l」を返します。

関連情報