it-swarm.dev

깨진 심볼릭 링크를 어떻게 찾을 수 있습니까

전혀 가리 키지 않는 모든 심볼릭 링크를 찾는 방법이 있습니까?

find ./ -type l

모든 심볼릭 링크를 제공하지만 어딘가로 이동하는 링크와 그렇지 않은 링크를 구분하지 않습니다.

나는 현재하고있다 :

find ./ -type l -exec file {} \; | grep broken

그러나 대체 솔루션이 무엇인지 궁금합니다.

304
gabe.

http://www.ibiblio.org/pub/Linux/utils/file/symlinks-1.4.tar.gzsymlinks 명령을 사용하여 다양한 심볼릭 링크를 식별 할 수 있습니다. 특성. 예를 들어 :

$ rm a
$ ln -s a b
$ symlinks .
dangling: /tmp/b -> a
41
Sam Morris

Rozcietrzewiacz가 이미 언급했듯이 find -L 검색을 심볼릭 디렉토리로 확장하면 예기치 않은 결과가 발생할 수 있으므로 최적의 방법은 아닙니다. 아직 언급하지 않은 것은

find /path/to/search -xtype l

보다 간결하고 논리적으로 동일한 명령입니다

find /path/to/search -type l -xtype l

지금까지 제시된 솔루션 중 어느 것도 순환 심 링크를 감지하지 못하는데, 이는 또 다른 유형의 파손입니다. 이 질문 이식성을 해결합니다. 요약하면, 순환 링크를 포함하여 깨진 기호 링크를 찾는 이식 가능한 방법은 다음과 같습니다.

find /path/to/search -type l -exec test ! -e {} \; -print

자세한 내용은 이 질문 또는 ynform.org 를 참조하십시오. 물론,이 모든 것의 확실한 소스는 findutils documentaton 입니다.

33
pooryorick

-L 명령에 플래그를 지정하면 grep을 제거 할 수 있습니다.

$ find -L . -type l

http://www.commandlinefu.com/commands/view/8260/find-broken-symlinks

남자에게서 :

 -L      Cause the file information and file type (see stat(2)) returned 
         for each symbolic link to be those of the file referenced by the
         link, not the link itself. If the referenced file does not exist,
         the file information and type will be for the link itself.
9
kwarrick

링크가 끊어 졌는지 주기적인지에 관계없이 다른 동작이 필요한 경우 find와 함께 % Y를 사용할 수도 있습니다.

$ touch a
$ ln -s a b  # link to existing target
$ ln -s c d  # link to non-existing target
$ ln -s e e  # link to itself
$ find . -type l -exec test ! -e {} \; -printf '%Y %p\n' \
   | while read type link; do
         case "$type" in
         N) echo "do something with broken link $link" ;;
         L) echo "do something with cyclic link $link" ;;
         esac
      done
do something with broken link ./d
do something with cyclic link ./e

이 예는 이 게시물 (사이트 삭제) 에서 복사되었습니다.

참조

7
andy

OP 버전의 변형 인 간단한 노 브레이크 답변입니다. 때로는 입력하거나 기억하기 쉬운 것을 원할 수도 있습니다.

find . | xargs file | grep -i "broken symbolic link"

또는 NULL 종료자를 처리해야하는 경우 :

find . -print0 | xargs -0 file | grep -i "broken symbolic link"
3
trinth

필자의 경우에는 이것을 사용하고 깨진 심볼릭 링크를 찾을 디렉토리를 알고 있기 때문에 꽤 잘 작동합니다.

find -L $path -maxdepth 1 -type l

내 폴더에는 /usr/share 그러나 그것을 통과하지 않습니다. 교차 장치 링크 및 chroot 등에 유효한 링크는 여전히 함정이지만 사용 사례로는 충분합니다.

2
Iskren

zsh 사용자의 경우 :

rm -v **/*([email protected])

에서 zsh 사용 설명서 (broken symlinks)

2
murlakatamenka

find -L . -type l |xargs symlinks는 링크가 존재하는지 여부를 찾은 파일별로 제공합니다.

1
Alex

현재 디렉토리에서 깨진 심볼릭 링크의 이름이 인쇄됩니다.

for l in $(find . -type l); do cd $(dirname $l); if [ ! -e "$(readlink $(basename $l))" ]; then echo $l; fi; cd - > /dev/null; done

배쉬에서 작동합니다. 다른 껍질에 대해 모른다.

1
conradkleinespel