내 시스템에는 깨진 링크가 많이 있습니다. 끊어진 링크를 모두 다시 연결하는 스크립트를 작성했습니다. 그러나 스크립트가 실행된 후 find를 다시 실행하면 링크가 여전히 존재함을 알 수 있습니다.
이것은 내 코드입니다.
find /home/saman -lname '/home/saman/*' -exec \
sh -c 'ln -snf "/home$(readlink "$0")" "$0"' {} \;
위 명령을 실행한 후 끊어진 링크를 검색했지만 여전히 찾았습니다.
find . -type l | xargs file | grep broken
내가 뭘 잘못했나요?
답변1
첫 번째 문제는 find
명령이 상대 경로가 아닌 전체 경로를 사용하여 링크만 찾는다는 것입니다. 표시하려면:
$ ln -s /home/terdon/foo/NonExistantFile foo
$ ln -s NonExistantFile bar
$ tree
.
|-- bar -> NonExistantFile
`-- foo -> /home/terdon/foo/NonExistantFile
위의 예에서는 두 개의 깨진 링크를 만들었습니다. 첫 번째는 절대 경로를 사용하고 두 번째는 상대 경로를 사용합니다. find
지금 귀하의 명령을 시도해 보면 ( echo
무슨 일을 하는지 확인하기 위해 실행하는 대신 relink 명령을 사용하여) 다음 두 가지 중 하나만 찾을 수 있습니다.
$ find . -lname '/home/terdon/*' -exec \
sh -c 'echo ln -snf "/home$(readlink "$0")" "$0"' {} \;
ln -snf /home/home/terdon/foo/NonExistantFile ./foo
두 번째 문제는 경로가 잘못되었다는 것입니다. 링크를 로 다시 생성하고 있습니다 "/home$(readlink "$0")" "$0"
. readlink
명령은 이미 전체 경로를 표시하므로 링크를 추가 하면 원하는 /home
결과가 나오지 않습니다./home/home/...
더 중요한 것은 당신이 시도하는 것이 불가능하다는 것입니다. 링크가 끊어지면 대상이 존재하지 않는다는 의미입니다. 대상이 존재하지 않고 링크할 곳이 없기 때문에 단순히 파일을 다시 링크할 수는 없습니다.도착하다. 당신이 할 수 있는 유일한 일은 링크의 대상을 다시 만드는 것입니다. 그러나 이것은 끊어진 링크가 새로운 빈 파일을 가리키도록 만들기 때문에 별로 유용하지 않을 것입니다. 이것이 정말로 당신이 하고 싶은 일이라면 시도해 볼 수 있습니다.
find . -type l -exec sh -c 'touch "$(readlink "{}")" ' \;
마지막으로 i) 끊어진 링크를 모두 찾고 ii) 컴퓨터에서 링크 대상과 동일한 이름을 가진 파일을 검색하고 iii) 해당 목록을 제공하고 iv) 어떤 것인지 묻는 더 복잡한 스크립트를 만들 수 있습니다. 이제 연결되어야 할 것입니다.
답변2
내 시스템에는 깨진 링크가 많이 있습니다. 끊어진 링크를 모두 다시 연결하는 스크립트를 작성했습니다. 그러나 스크립트가 실행된 후 find를 다시 실행하면 링크가 여전히 존재한다는 것을 알 수 있습니다.
GNU Linux 시스템의 이 행은 흥미로울 수 있습니다. 나는 그것이 @Giles에서 나온 것이라고 생각하지만 지금은 참조를 찾을 수 없습니다.
find -xtype l -delete
깨진 소프트 링크를 재귀적으로 찾아 제거합니다.