私はディレクトリでいくつかの管理タスクを実行したいと思います、そして、指定されたディレクトリにそのディレクトリを指すシンボリックリンクがあることを確認したいと思います。到着それ。シンボリックリンクがどのディレクトリを指しているのか簡単にわかりますが、今は反対の関係を見たいと思います。
答え1
シンボリックリンクは従わないので、徹底的な検索を行う必要があります。さらに、シンボリックリンクはテキストであるため、ファイルシステムがアンマウントされていても「既存」のままになります(他の場所にインストールされている場合、またはディレクトリ名が変更された場合は別の宛先を持つことができます)。したがって、あなたができる最大のことは、特定の/target
ディレクトリ階層内で特定のファイル(またはディレクトリ)を指すシンボリックリンクを見つけることです/haystack
。
(実際にシンボリックリンクを探しているとします。到着特定のディレクトリ。以下を指すシンボリックリンクを探します。入力するディレクトリ(つまり、そのディレクトリのファイルまたはサブディレクトリ)または期間ディレクトリ(つまり、削除するとハングアップできるディレクトリ)はより難しい問題です。 )
いくつかのバージョンのfind(たとえば、(最近の)Linux、FreeBSD、またはMac OS X)では、以下をターゲットとするシンボリックリンクを簡単に見つけることができます/target
。
find -L /haystack -xtype l -samefile /target
find
コマンドにデフォルトのコマンドがないシステムでは、-samefile
可能であればkshまたはbashを使用できます。-xtype
サポートされていない場合は、コマンドを削除すると、ターゲット自体(またはそれを指すハードリンク)も一覧表示されます。
find -L /haystack -xtype l -exec ksh -c '
for x; do [[ $0 -ef $x ]] && printf "%s\n" "$x"; done
' /target {} +
ファイルの一貫性をテストしたり、シンボリックリンクに関する情報を取得したりするためのPOSIXメソッドが不足しているため、POSIXツールのみを使用してこれを行うことははるかに困難です。これはディレクトリの解決策です。ファイル名に改行文字がないとします。
find /haystack -type l -exec sh -c 'cd -P -- "$0" && pwd' {} \; |
grep -Fx "$(cd -P /target && pwd)"
これは私の必須のzshソリューションです。
echo /haystack/**/*(@e\''[[ $REPLY -ef /target ]]'\')