如何找到目标路径与模式匹配的符号链接?

如何找到目标路径与模式匹配的符号链接?

我正在尝试查找当前文件夹下目标包含“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

如果您find支持-lname-ilname(某些 BSD 也支持 GNU 扩展(包括苹果系统/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

请注意,如果需要,任何 shell 代码都可以写在一行上,但我不明白这一点。在这里,如果您想将它们放在一行上,只需将这些行连接在一起即可。

要使用 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 {} +

相关内容