다른 파일이 아닌 디렉토리를 가리키는 심볼릭 링크만 찾는 우아한 방법이 있습니까?

다른 파일이 아닌 디렉토리를 가리키는 심볼릭 링크만 찾는 우아한 방법이 있습니까?

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

관련 정보