他のファイルではなくディレクトリを指すシンボリックリンクのみを見つけるエレガントな方法はありますか?

他のファイルではなくディレクトリを指すシンボリックリンクのみを見つけるエレガントな方法はありますか?

find -type lシンボリックリンクを表示しますが、ディレクトリをls -l | grep '^l'指すシンボリックリンクとファイルを指すシンボリックリンクを区別しません。これは非常に不器用な方法ですが、find -type l -exec file -L '{}' ';' | grep directory非常に非効率的です。

ディレクトリへのシンボリックリンクのみを見つけるより良い方法はありますか?

答え1

~によるとPOSIX仕様test-dテストは次のとおりです。

もし本当だパス名ディレクトリの既存のディレクトリエントリを確認します。

したがって、シンボリックリンクがある場合は[ -d ... ]それを使用できます。

find . -type l -exec test -d {} \; -print

または、各リンクに対して外部コマンドを実行しないでください。

find . -type l -exec sh -c 'for l; do [ -d "$l" ] && printf "%s\n" "$l"; done' _ {} +

答え2

-type lで使用できます-xtype d。 (しかしPOSIXかどうかはわかりません-xtype。)

答え3

~のため扱いにくいユーザーは以下を使用して簡単に達成できます。グローバル予選 (@-/):

for F in **/*(N@-/); do the_thing "$F"; done

式分析:**/*globは、隠しファイル/ディレクトリを除くすべてのファイル/ディレクトリを再帰的に一致させます。(expr)glob は、特定の基準を満たすファイルに一致を制限します。ここの基準は次のとおりです。

  • N:一致するファイルが存在しない場合は、エラーを発生させるのではなく、nullに拡張するようにこの拡張でnullglobを有効にします。この修飾子は通常、ループまたは配列割り当てでglobを使用するときにfor必要です。
  • @:シンボリックリンクにのみ一致します。
  • -: テストリンク自体からテストリンクに切り替えるターゲット
  • /: ディレクトリのみ一致

私のシステムで実行されるサンプル出力/etc/

% ls -ldF -- **/*(@-/)
lrwxrwxrwx 1 root root 46 Sep 22  2022 alternatives/desktop-plasma5-wallpaper -> /usr/share/desktop-base/active-theme/wallpaper/
lrwxrwxrwx 1 root root 39 Sep 22  2022 alternatives/desktop-theme -> /usr/share/desktop-base/homeworld-theme/
lrwxrwxrwx 1 root root 36 Sep 22  2022 alternatives/vendor-logos -> /usr/share/desktop-base/debian-logos/
lrwxrwxrwx 1 root root 11 Sep 22  2022 runit/runsvdir/default/ssh -> /etc/sv/ssh/
lrwxrwxrwx 1 root root 18 Aug  7  2022 xdg/systemd/user -> ../../systemd/user/

これは直接リンクだけでなく、ディレクトリへのリンクを指すリンクも一致します。

答え4

find . -type l -exec test -d {} \; -print以下は、多くのリンクよりもうまく機能する私のバージョンです。

$ find / -type l -print0 |
xargs -0 stat -L -c'%F %n' |
awk '$1 == "directory" { print substr($0, 11) }'

すべてのリンクを見つけてそれを提供してstatファイルの種類を決定し、ファイルawk名のみを残してディレクトリをフィルタリングします。

そうでない場合は、awk次のような結果が得られます。

directory /sys/module/libnvdimm/holders/nfit

確認する:

$ ll /sys/module/libnvdimm/holders/nfit
lrwxrwxrwx 1 root root 0 Oct 20 13:49 /sys/module/libnvdimm/holders/nfit -> ../../nfit
$ readlink -f /sys/module/libnvdimm/holders/nfit
/sys/module/nfit
$ ll -d /sys/module/nfit
drwxr-xr-x 6 root root 0 Oct 16 20:45 /sys/module/nfit

関連情報