zsh / Bashでglobbingを実行するときに部分的にシンボリックリンクをチェック/フォローする

zsh / Bashでglobbingを実行するときに部分的にシンボリックリンクをチェック/フォローする

aへのシンボリックリンクであるファイルがあるとしましょう。bこのファイルはへのシンボリックリンクですc

zshの:A修飾子を使用してaワイルドカードを使用すると、すべてのシンボリックリンクを確認する絶対パスが作成されるため、ライブラリがあるシステムでは絶対パスにa(:A)拡張されます。crealpath

任意のシンボリックリンク深度までファイルを取得するbことは(絶対的にまたは比較的に、しかしビューの出力を介さずにワイルドカードの結果として直接)可能ですか?ls -l

Bashのソリューションも知っておく価値があります。

ベストアンサー1

いつでもglob修飾子で機能する関数を作成できます+

$zmodload zsh/stat
$resolve() { [[ -L $REPLY ]] && stat -A REPLY +link -- ${1-$REPLY} }
$ 印刷 -r - a(+分析)
第二
$ 印刷 -r - a(+分析:a)
/home/stephane/b (下記の警告を参照)

これにより、a(+resolve+resolve)2番目のファイルは最初のファイル名()の結果resolveではなく元のファイル名()として呼び出されます。aしかし、次のようにすることができます。resolveb

$ print -r - a(e['resolve && resolve'])
c

2つのresolvesを接続します。ただし、(注意事項は:a上記の使用方法にも適用されます。)この特定の例では機能しますが、通常の場合、相対パスが作成された場合、シンボリックリンクのターゲットはSymlinkは現在の作業ディレクトリではないため、それを指す場合はdir/link代わりにfooファイルなので、現在の作業ディレクトリでシンボリックリンクを確認する場合にのみ機能します。dir/foofoo

resolveただし、これを変更するとシンボリックリンクターゲットのフルパスが計算されるため、問題はなくなります。

resolve() {
  local target
  [[ -L $REPLY ]] &&
    stat -A target +link -- ${1-$REPLY} &&
    case $target in
      (/*) REPLY=$target;;
      (*) REPLY=${REPLY:h:a}/$target;;
    esac
}

bashreadlink()glob修飾子やインタフェース(組み込みインタフェースなどzsh)はありませんが、stat一部のシステムでは次のコマンドを見つけることができますreadlink

$ readlink a
b

おすすめ記事