대상에 "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 {} +