특정 디렉토리에 어떤 심볼릭 링크가 있는지 어떻게 확인할 수 있나요?

특정 디렉토리에 어떤 심볼릭 링크가 있는지 어떻게 확인할 수 있나요?

나는 디렉토리에서 몇 가지 관리 작업을 수행하고 싶고, 주어진 디렉토리에 해당 디렉토리를 가리키는 심볼릭 링크가 있는지 확인하고 싶습니다.도착하다그것. 심볼릭 링크가 어느 디렉토리를 가리키는지 쉽게 알 수 있는데, 이제는 반대 관계를 보고 싶습니다.

답변1

심볼릭 링크는 따르지 않으므로 철저한 검색을 수행해야 합니다. 또한 심볼릭 링크는 텍스트이므로 해당 파일 시스템이 마운트 해제된 경우에도 "기존" 상태로 유지됩니다(다른 위치에 설치되거나 디렉터리 이름이 바뀌면 다른 대상을 가질 수 있음). 따라서 당신이 할 수 있는 가장 큰 일은 /target특정 디렉토리 계층 구조 내에서 특정 파일(또는 디렉토리)을 가리키는 심볼릭 링크를 찾는 것입니다 /haystack.

(실제로 심볼릭 링크를 찾고 있다고 가정합니다.도착하다특정 디렉토리. 다음을 가리키는 심볼릭 링크를 찾으십시오.입력하다디렉터리(즉, 해당 디렉터리의 파일이나 하위 디렉터리) 또는기간디렉터리(즉, 삭제하면 매달릴 수 있는 디렉터리)는 더 어려운 문제입니다. )

일부 버전의 find(예: (최근) Linux, FreeBSD 또는 Mac OS X)를 사용하면 다음을 대상으로 하는 기호 링크를 쉽게 찾을 수 있습니다 /target.

find -L /haystack -xtype l -samefile /target

find명령에 기본 명령이 없는 시스템에서는 -samefile가능한 경우 ksh 또는 bash를 사용할 수 있습니다. -xtype지원되지 않는 경우 제거하면 명령은 대상 자체(또는 이를 가리키는 하드 링크)도 나열합니다.

find -L /haystack -xtype l -exec ksh -c '
    for x; do [[ $0 -ef $x ]] && printf "%s\n" "$x"; done
' /target {} +

파일 일관성을 테스트하거나 기호 링크에 대한 정보를 얻는 POSIX 방법이 부족하기 때문에 POSIX 도구만 사용하여 이를 수행하는 것은 훨씬 더 어렵습니다. 이것은 디렉토리에 대한 솔루션입니다. 파일 이름에 개행 문자가 없다고 가정합니다.

find /haystack -type l -exec sh -c 'cd -P -- "$0" && pwd' {} \; |
  grep -Fx "$(cd -P /target && pwd)"

이것은 나의 필수 zsh 솔루션입니다.

echo /haystack/**/*(@e\''[[ $REPLY -ef /target ]]'\')

답변2

/검색을 이용 하셔야 합니다찾기(1)-type l모든 링크를 식별하는 옵션 과 그 뒤에정규식(1)관심 있는 링크를 격리합니다.

관련 정보