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