자신을 가리키지 않는 모든 심볼릭 링크를 찾는 방법이 있나요?
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
링크 자체가 아닌 링크가 참조하는 파일의 정보로 만듭니다. 참조된 파일이 존재하지 않는 경우 파일 정보 및 유형이 링크 자체에 사용됩니다.