트리 외부를 가리키는 디렉토리 트리에서 모든 심볼릭 링크 찾기

트리 외부를 가리키는 디렉토리 트리에서 모든 심볼릭 링크 찾기

나는 종종 디렉토리 트리를 다른 위치로 이동하거나 해당 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

관련 정보