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