깨진 심볼릭 링크를 어떻게 찾을 수 있나요?

깨진 심볼릭 링크를 어떻게 찾을 수 있나요?

아무 것도 가리키지 않는 모든 심볼릭 링크를 찾는 방법이 있습니까?

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인용된 트릭솔로로~에서명령줄fu멋지고 해키해 보이지만 아주 하나가 있습니다위험한 함정: 모든 심볼릭 링크를 따릅니다. 아래 제시된 내용으로 디렉토리를 고려하십시오.

$ 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 이것은 사소한 불편함처럼 보일 수 있습니다(명령은 모든 것을 탐색하는 데 "그냥" 시간이 오래 걸립니다 /usr/share). 그러나 더 심각한 결과를 초래할 수 있습니다. 예를 들어 chroot 환경을 고려해보세요. 이 환경은 기본 파일 시스템의 일부 하위 디렉터리에 존재할 수 있으며 절대 위치에 대한 심볼릭 링크를 포함할 수 있습니다. 해당 링크는 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

각 기호 링크에 대해 반환된 파일 정보 및 파일 유형( stat(2) 참조)이 링크 자체가 아니라 링크에서 참조하는 파일의 정보가 되도록 합니다. 참조된 파일이 존재하지 않는 경우 파일 정보 및 유형은 링크 자체에 대한 것입니다.

관련 정보