
나는 종종 디렉토리 트리를 다른 위치로 이동하거나 해당 tarball을 다른 시스템에 복사하는데, 디렉토리 트리에 심볼릭 링크가 있는지 확인하는 방법을 원합니다.ㅏ외부 위치를 가리킵니다.ㅏ이는 이동/복사된 디렉터리에서 삭제되기 때문입니다.
답변1
realpath
와 함께 사용할 이라는 프로그램을 원합니다 find
.
예를 들어:
find . -type l -exec realpath {} \; | grep -v "^$(pwd)"
답변2
사용파일 시스템 바인딩디렉터리 트리의 또 다른 보기를 만듭니다.
mkdir /tmp/view
bindfs /some/directory /tmp/view
그런 다음 사용심볼릭 링크유틸리티(다양한 배포판 또는원천) 파일 시스템 간 링크를 감지합니다.
symlinks -r /tmp/view | sed -n 's/^\(absolute\|other_fs\): //p'
(파싱 출력에서는 기호 링크와 해당 대상에 개행 문자가 포함되어 있지 않으며 기호 링크에 대한 경로에 하위 문자열이 포함되어 있지 않다고 가정합니다 ->
.) 동일한 유틸리티를 사용하여 절대 기호 링크를 상대 기호 링크로 변환할 수도 있습니다. 원래 위치).
답변3
zsh 사용:
cd -P -- "$dir"
for i (**/*(ND@)) [[ $i:A = $PWD/* ]] || [[ $i:A = $PWD ]] || print -r -- "$i => $i:A"
이제 디렉토리가 있고 / foo 에 대한 심볼릭 링크가 /foo
있는 경우 링크의 대상은 /foo 에 있지만 일단 이동하면 링크가 여전히 끊어지므로 심볼릭 링크를 절대 경로와 일치시킬 수도 있습니다./foo/bar
/foo/baz
그러나 그럼에도 불구하고 bar => ../foo/baz
문제 /foo
가 될 수 있으므로(거짓양성) 트리 외부의 심볼릭 링크는 a => b
어디에 b
있습니까(거짓양성, 보고 싶은 방식에 따라 다름)
답변4
realpath
기호 링크를 해결하는 GNU coreutilsprovedes . 이 방법을 사용하면 다음과 같이 각 기호 링크의 대상을 현재 작업 디렉터리와 비교할 수 있습니다.
#!/bin/bash
find . | while read filename
do
if realpath $filename | grep -E "^$PWD" > /dev/null
then
echo 'this file is safe'
else
echo 'this file links externally'
fi
done