대상 경로가 패턴과 일치하는 심볼릭 링크를 찾는 방법은 무엇입니까?

대상 경로가 패턴과 일치하는 심볼릭 링크를 찾는 방법은 무엇입니까?

대상에 "Dropbox"가 포함된 현재 폴더 아래의 모든 심볼릭 링크를 찾으려고 합니다.

내 추측은 다음과 같다:

find . -type l -iname '*Dropbox*'

그러나 이것은 아무것도 반환하지 않습니다.

다음과 같은 항목을 찾고 싶습니다.

com.adobe.illustrator.plist -> /Volumes/data/Dropbox (Personal)/Mackup/Library/Preferences/com.adobe.illustrator.plist
com.apple.Terminal.plist -> /Volumes/data/Dropbox (Personal)/Mackup/Library/Preferences/com.apple.Terminal.plist
com.noodlesoft.Hazel.plist -> /Volumes/data/Dropbox (Personal)/Mackup/Library/Preferences/com.noodlesoft.Hazel.plist

이렇게 하면 텍스트 없이 링크를 다시 만들 수 있습니다 (Personal). (이것을 한 줄로 달성할 수 있는 방법이 있다면 정말 좋을 것 같아요!)

답변1

또는 (일부 BSD는 find다음 을 포함한 GNU 확장도 지원합니다. -lname)-ilname애플 시스템당신 /Volumes은))를 사용할 수도 있다고 제안했습니다.

find . -lname '*Dropbox*' -exec ls -ld {} +

또는 대소문자를 구분하지 않습니다.

find . -ilname '*dropbox*' -exec ls -ld {} +

그렇지 않은 경우(또는 이러한 링크를 사용하여 쉽게 작업을 수행하거나 정렬된 목록을 선호하는 경우) 이미 zsh해당 링크가 있고(macOS에서 기본적으로 사용 가능) 다음을 수행할 수 있습니다.

zmodload zsh/stat
set -o extendedglob # for (#i) for case insensitive
link_match() {
  local target
  zstat -A target +link -- "${2-$REPLY}" &&
    [[ $target = $~1 ]]
}
ls -ld -- **/*(D@e:'link_match "(#i)*dropbox*"':)

또는 링크를 다시 만드세요:

zmodload zsh/stat
for l (**/*(D@))
  zstat -A target +link -- $l &&
    [[ $target = *"Dropbox (Personal)"* ]] &&
    rm -f -- $l &&
    ln -s -- ${target//" (Personal)"} $l

원하는 경우 모든 쉘 코드를 한 줄에 작성할 수 있지만 이것이 이해되지 않습니다. 여기에서 한 줄에 넣고 싶으면 줄을 하나로 합치면 됩니다.

GNU 또는 FreeBSD/macOS 유틸리티를 사용하여 유사한 작업을 수행하는 것은 bash더 복잡하고 덜 효율적입니다.

LC_ALL=C find . -lname '*Dropbox (Personal)*' -exec bash -c '
  for l do
    target=$(readlink "$l" && echo .) || continue
    target=${target%??}
    rm -f "$l" &&
      ln -s -- "${target//" (Personal)"}" "$l"
  done' bash {} +

관련 정보