答え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
:列に対応するパラメータr
awを印刷します1
C
。ここで、パラメータは次のglobで生成されたパラメータです。ls -ld
各シンボリックリンクに関する詳細情報を取得するには、次のように置き換えます。**/
:すべてのレベルのサブディレクトリ(再帰的ワイルドカード)*
:任意の名前のファイル(*
ほとんどのシェルと同様に、zshも文字ではなく文字も受け入れますが、任意の文字で構成されています)(...)
:glob修飾子は、ファイル名だけでなく、他の基準と一致するかどうかをさらに修飾します。N
:nullglob
このglobを有効にします(一致する項目がなくても失敗しません。空のリストを渡してもprint
何も印刷されません)。D
:enableddotglob
: 隠しファイルも考慮してください。@
: ファイル形式の制限シンボリックリンク。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」を返します。