
아무 것도 가리키지 않는 모든 심볼릭 링크를 찾는 방법이 있습니까?
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) 참조)이 링크 자체가 아니라 링크에서 참조하는 파일의 정보가 되도록 합니다. 참조된 파일이 존재하지 않는 경우 파일 정보 및 유형은 링크 자체에 대한 것입니다.