주어진 디렉토리 내의 파일/디렉토리를 가리키는 모든 심볼릭 링크를 찾는 방법

주어진 디렉토리 내의 파일/디렉토리를 가리키는 모든 심볼릭 링크를 찾는 방법

이 문제에 대해또는이것에(예를 들어) 특정 디렉토리(라고 부르겠습니다 /dir1)를 가리키는 심볼릭 링크를 찾는 방법에 대한 솔루션을 얻을 수 있지만 저는 /dir1.

이와 같은 디렉토리를 삭제하고 싶지만 다른 디렉토리(라고 부르겠습니다 /dir2)에 /dir1.

또한 절대 또는 상대 경로를 사용하여 이러한 심볼릭 링크를 만들었을 수도 있습니다. 나의 유일한 도움은 내가 확인하고 싶은 심볼릭 링크가 마운트된 파일 시스템에 있다는 것을 아는 것입니다 /dir2.

답변1

다음을 사용하여 모든 심볼릭 링크를 찾을 수 있습니다.

find / -type l 

디스크의 각 위치에 접근하려면 루트로 실행해야 할 수도 있습니다.

이를 확장하여 링크의 전체 경로를 얻을 수 있으며 제거하려는 대상 디렉터리에 대해 이를 출력 readlink -f할 수 있어야 합니다 .grep

find / -type l -exec readlink -f {} + | grep -F /dir2

find / -type l -printf '%l\n'얻는 상대 링크가 ../tmp/xyz대상 디렉토리를 가리킬 수 있지만 완전히 확장되지 않았기 때문에 일치하지 않기 때문에 를 사용하면 작동하지 않습니다.

답변2

내 경우에는 허용된 답변이 작동하지 않았습니다(링크 소스가 출력되지 않았기 때문에). 이것은 나에게 효과적입니다.

나는 두 가지 절을 사용하여 이 문제를 해결했습니다 -exec.

find /home/ -type l -exec readlink -nf {} ';' -exec echo " <- {}" ';' | grep "/dir2"

답변3

그리고 zsh:

print -rC1 /dir2/**/*(ND@e['[[ $REPLY:P = /dir1(/*|) ]]'])

분할:

  • print -rC1: 열에 해당 매개변수 raw를 인쇄합니다 1 C. 여기서 매개변수는 다음 glob에서 생성된 매개변수입니다. ls -ld각 기호 링크에 대한 자세한 정보를 얻으려면 다음으로 바꾸십시오.
  • **/: 모든 수준의 하위 디렉터리(재귀적 와일드카드)
  • *: 임의의 이름을 가진 파일( *대부분의 쉘과 마찬가지로 zsh도 문자가 아닌 문자도 허용하지만 임의의 문자로 구성됨)
  • (...):glob 한정자는 파일 이름뿐만 아니라 다른 기준에 대한 일치 여부를 추가로 한정합니다.
  • N: nullglob이 glob을 활성화합니다(일치하는 항목이 없어도 실패하지 않습니다. 빈 목록을 전달하면 print아무것도 인쇄되지 않습니다).
  • D:enabled dotglob: 숨겨진 파일도 고려하세요.
  • @: 파일 형식 제한심볼릭 링크.
  • e['code']: 평가 결과가 true인 파일을 선택합니다 code. 내부에서는 code고려중인 파일이 $REPLY.
  • $REPLY:P: 파일에 대한 절대 및 표준(비기호 링크) 경로를 가져옵니다( realpath()표준 함수의 기능과 유사).
  • [[ string = pattern ]]문자열이 패턴(ksh의)과 일치하면 true를 반환합니다.
  • /dir1(/*|)단독으로 또는 뒤에 오는 패턴으로 /dir1일치합니다 ./dir1/

¹ 일치하는 파일이 없으면 현재 작업 디렉터리가 나열됩니다. glob 한정자를 ls제거하는 것이 좋습니다 .N

답변4

사례에 따라 다음을 사용하여 디렉터리를 삭제한 후 결과로 나타나는 잘못된 심볼릭 링크를 제거할 수 있습니다.

find -xtype l -delete

심볼릭 링크가 끊어지면 xtype 테스트는 "l"을 반환합니다.

관련 정보