답변:
나는 작업 에 사용 하지 말 것을 강력히 권합니다 find -L
(설명은 아래 참조). 이를 수행하는 다른 방법은 다음과 같습니다.
"순수한 find
"방법 을 사용하려면 다음과 같이 표시되어야합니다.
find . -xtype l
( xtype
역 참조 링크에서 수행 된 테스트입니다.) 일부 버전에서는이 기능을 사용할 수 없습니다 find
. 그러나 다른 옵션도 있습니다.
명령 test -e
내에서 exec 를 실행할 수도 있습니다 find
.
find . -type l ! -exec test -e {} \; -print
심지어 어떤 grep
트릭 조차 ( )보다 좋을 수도 있지만 더 안전 할 수도 find -L
있지만 질문에 제시된 것과 정확히 같지는 않습니다 (파일 이름을 포함한 전체 출력 라인에서 greps).
find . -type l -exec sh -c 'file -b "$1" | grep -q ^broken' sh {} \; -print
find -L
인용 트릭 솔로로 에서 commandlinefu는 좋은 해키 보이지만, 그것은 하나 개의 아주가 위험한 함정을 : 모든 심볼릭 링크가 따른다. 아래에 제시된 내용의 디렉토리를 고려하십시오.
$ 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 . A의 find
"외부 링크에 면역"입니다 명령을 사용하지 마십시오-L
.
1 이것은 약간의 불편 함처럼 보일 수 있습니다 (명령은 "모든 것을 순회하는 데 시간이 오래 걸립니다" /usr/share
). 그러나 더 심각한 결과를 초래할 수 있습니다. 예를 들어, chroot 환경을 고려하십시오. 기본 파일 시스템의 일부 하위 디렉토리에 존재할 수 있으며 절대 위치에 대한 심볼릭 링크를 포함 할 수 있습니다. 이 링크는 "외부"시스템에서 끊어진 것처럼 보일 수 있습니다. chroot에 들어간 후에는 적절한 위치 만 가리 키기 때문입니다. 또한 일부 부트 로더 /boot
는 부팅 파티션이로 마운트되었을 때 초기 부팅 단계에서만 의미가있는 심볼릭 링크를 사용 했음을 상기합니다 /
.
따라서 find -L
명령을 사용하여 무해한 디렉토리에서 깨진 심볼릭 링크를 찾아서 삭제하면 시스템이 손상 될 수도 있습니다.
/proc/XXX/exe
링크가 끊어 졌는지 확인하는 데는 작동하지 않습니다 . 이를 위해을 사용하십시오 test -e "$(readlink /proc/XXX/exe)"
.
find . -xtype l
은 "(궁극적 인) 대상 파일이 symlink 인 모든 symlink를 찾습니다"를 의미합니다. 그러나 심볼릭 링크의 궁극적 인 대상은 심볼릭 링크가 될 수 없습니다. 그렇지 않으면 링크를 계속 따라갈 수 있으며 궁극적 인 대상이 아닙니다. 그러한 심볼릭 링크가 없기 때문에 심볼릭 링크를 다른 것으로 정의 할 수 있습니다.
l
혼란이 줄어 듭니다.
-L
해킹 에는 적용되지 않지만 일반적으로 깨진 심볼릭 링크를 (맹목적으로) 제거하는 데 적용됩니다 .
http://www.ibiblio.org/pub/Linux/utils/file/symlinks-1.4.tar.gz 의 symlinks
명령을 사용하여 다양한 특성을 가진 심볼릭 링크를 식별 할 수 있습니다. 예를 들어 :
$ rm a
$ ln -s a b
$ symlinks .
dangling: /tmp/b -> a
symlinks
페도라에 사전 설치되어 있습니다.
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 입니다.
find -L
하며 순환 링크뿐만 아니라 함정도 다루고 있습니다. 한
-xtype
POSIX에 지정되지 않았기 때문에 find(1)
macOS 에서 -type
보았지만 실제로는 그렇지 않습니다 -xtype
.
-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.
링크가 끊어 졌는지 주기적인지에 관계없이 다른 동작이 필요한 경우 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
이 예는 이 게시물 에서 복사되었습니다 (사이트가 삭제됨) .
참고
find
명령을 지원하지 않는 사람들을위한 또 다른 속기 xtype
는 다음에서 파생 될 수 있습니다 find . type l -printf "%Y %p\n" | grep -w '^N'
. 앤디가 그의 대본에서 똑같은 (기본) 아이디어로 나를 이길 때 나는 그것을 별도의 답변으로 작성하기를 꺼려했습니다. :)
-type l
때문에 중복 적이 라고 생각 합니다. 그래서 아마 당신이 필요로하는 모두이다. 이 접근법에 감사드립니다.-xtype l
-type l
find -xtype l