답변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
: 열에 해당 매개변수r
aw를 인쇄합니다1
C
. 여기서 매개변수는 다음 glob에서 생성된 매개변수입니다.ls -ld
각 기호 링크에 대한 자세한 정보를 얻으려면 다음으로 바꾸십시오.**/
: 모든 수준의 하위 디렉터리(재귀적 와일드카드)*
: 임의의 이름을 가진 파일(*
대부분의 쉘과 마찬가지로 zsh도 문자가 아닌 문자도 허용하지만 임의의 문자로 구성됨)(...)
:glob 한정자는 파일 이름뿐만 아니라 다른 기준에 대한 일치 여부를 추가로 한정합니다.N
:nullglob
이 glob을 활성화합니다(일치하는 항목이 없어도 실패하지 않습니다. 빈 목록을 전달하면print
아무것도 인쇄되지 않습니다).D
:enableddotglob
: 숨겨진 파일도 고려하세요.@
: 파일 형식 제한심볼릭 링크.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"을 반환합니다.