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