ターゲットパスがパターンに一致するシンボリックリンクを見つける方法は?

ターゲットパスがパターンに一致するシンボリックリンクを見つける方法は?

ターゲットに「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

必要に応じて、すべてのシェルコードを1行に書くことができますが、これはわかりません。ここで1行に入れたい場合は、行を1つにまとめてください。

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 {} +

おすすめ記事