깨진 심볼릭 링크를 찾는 방법

깨진 심볼릭 링크를 찾는 방법

자신을 가리키지 않는 모든 심볼릭 링크를 찾는 방법이 있나요?

find ./ -type l

모든 심볼릭 링크를 제공하지만 어딘가로 가는 링크와 어디로 가지 않는 링크를 구별하지는 않습니다.

나는 현재하고 있습니다 :

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

하지만 대체 솔루션이 무엇인지 알고 싶습니다.

답변1

나는 강력히 추천한다아니요작업용 find -L (아래 설명 참조). 이를 수행하는 다른 방법은 다음과 같습니다.

  • "순수한" 접근 방식을 사용 find하고 GNU 구현을 가정 하면 find다음과 같아야 합니다.

    find . -xtype l
    

    (xtype역참조된 링크에서 수행되는 테스트입니다)

  • 이식성(비효율적이지만)은 다음 명령 test -e으로 도 수행할 수 있습니다.find

    find . -type l ! -exec test -e {} \; -print
    
  • 심지어 일부 grep트릭이 더 나을 수도 있습니다(예:더 안전한) 보다 find -L, 그러나 질문에서 요구한 것과 정확히 일치하지는 않습니다(파일 이름을 포함하여 전체 출력 줄에 대해 grep).

    find . -type l -exec sh -c 'file -b "$1" | grep -q "^broken"' sh {} \; -print
    

find -L견적 팁독주~에서명령줄 푸보기에는 좋고 구식이지만 매우위험한 함정: 모든 심볼릭 링크를 따르십시오. 다음을 포함하는 디렉토리를 고려하십시오.

$ ls -l
total 0
lrwxrwxrwx 1 michal users  6 May 15 08:12 link_1 -> nonexistent1
lrwxrwxrwx 1 michal users  6 May 15 08:13 link_2 -> nonexistent2
lrwxrwxrwx 1 michal users  6 May 15 08:13 link_3 -> nonexistent3
lrwxrwxrwx 1 michal users  6 May 15 08:13 link_4 -> nonexistent4
lrwxrwxrwx 1 michal users 11 May 15 08:20 link_out -> /usr/share/

find -L . -type l해당 디렉토리에서 실행 하면 /usr/share/모든 항목도 검색됩니다(시간이 오래 걸릴 수 있음) 1 .find"나가는 링크의 영향을 받지 않는" 명령 의 경우에는 다음을 사용하지 마십시오.-L.


1 이것은 약간 불편한 것처럼 보일 수 있습니다("just" 명령은 모든 명령을 수행하는 데 오랜 시간이 걸립니다 /usr/share). 그러나 더 심각한 결과를 초래할 수 있습니다. 예를 들어, chroot 환경을 생각해 보십시오. 이 환경은 기본 파일 시스템의 일부 하위 디렉터리에 존재할 수 있으며 절대 위치에 대한 기호 링크를 포함할 수 있습니다. "외부" 시스템에서는 이러한 링크가 깨진 것처럼 보입니다. 일단 루트를 지정하면 올바른 위치를 가리키기 때문입니다. 또한 일부 부트 로더는 초기 부팅 단계에서만 의미가 있는 심볼릭 링크를 사용했다는 것을 기억합니다 /boot. 즉, 부팅 파티션이 /.

따라서 find -L이 명령을 사용하여 겉보기에 무해해 보이는 디렉토리에서 깨진 심볼릭 링크를 찾아 삭제하면 시스템이 손상될 수도 있습니다.

답변2

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 문서.

답변3

명령은 symlinks다음에서 비롯됩니다.http://www.ibiblio.org/pub/Linux/utils/file/symlinks-1.4.tar.gz다양한 특성을 가진 기호 링크를 식별하는 데 사용할 수 있습니다. 예를 들어:

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

답변4

-L나는 당신의 명령에 플래그를 추가하면 다음에서 벗어날 수 있다고 믿습니다 grep.

$ find -L . -type l

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

매뉴얼에서:

-L

각 심볼릭 링크((2) 참조)가 반환하는 파일 정보와 파일 형식을 stat링크 자체가 아닌 링크가 참조하는 파일의 정보로 만듭니다. 참조된 파일이 존재하지 않는 경우 파일 정보 및 유형이 링크 자체에 사용됩니다.

관련 정보