a
へのシンボリックリンクであるファイルがあるとしましょう。b
このファイルはへのシンボリックリンクですc
。
zshの:A
修飾子を使用してaワイルドカードを使用すると、すべてのシンボリックリンクを確認する絶対パスが作成されるため、ライブラリがあるシステムでは絶対パスにa(:A)
拡張されます。c
realpath
任意のシンボリックリンク深度までファイルを取得する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
しかし、次のようにすることができます。resolve
b
$ print -r - a(e['resolve && resolve'])
c
2つのresolve
sを接続します。ただし、(注意事項は:a
上記の使用方法にも適用されます。)この特定の例では機能しますが、通常の場合、相対パスが作成された場合、シンボリックリンクのターゲットはSymlinkは現在の作業ディレクトリではないため、それを指す場合はdir/link
代わりにfoo
ファイルなので、現在の作業ディレクトリでシンボリックリンクを確認する場合にのみ機能します。dir/foo
foo
resolve
ただし、これを変更するとシンボリックリンクターゲットのフルパスが計算されるため、問題はなくなります。
resolve() {
local target
[[ -L $REPLY ]] &&
stat -A target +link -- ${1-$REPLY} &&
case $target in
(/*) REPLY=$target;;
(*) REPLY=${REPLY:h:a}/$target;;
esac
}
bash
readlink()
glob修飾子やインタフェース(組み込みインタフェースなどzsh
)はありませんが、stat
一部のシステムでは次のコマンドを見つけることができますreadlink
。
$ readlink a
b