シェルスクリプトで使用するシンボリックリンクのターゲットを取得するコマンドラインメソッドを探しています。これまで私が見た最も近いのは、をstat -N src
出力することですsrc -> dst
。もちろん、出力を解析してターゲットを取得できますが、ターゲットをdst
取得する直接的な方法があるかどうかを知りたいです。
答え1
readlink
別のオプションは、可能であれば特別に設計されたコマンドを使用することです。
例えば
$ readlink -f `command -v php`
/usr/bin/php7.1
答え2
Mac OS XおよびFreeBSD/NetBSD/等から。それ:
stat -f %Y <filename>
より一般的には、解決策は次のとおりです(stat --printf = % Nは奇妙な引用符を使用します)。
ls -l b | sed -e 's/.* -> //'
例:
# ln -s a b
# stat -f %Y b
a
別の方法は次のとおりです。
# find b -maxdepth 0 -printf %l
a#
最後の行は改行がないので壊れました。しかし、変数に結果が必要な場合は、次のように問題ありません。
# f=$(find b -maxdepth 0 -printf %l)
# echo $f
a
ディレクトリの場合は、そのディレクトリに移動しないように-maxdepth
してください。find
b
答え3
find
これはGNUを使用して行うことができますfind src -prune -printf "%l\n"
。
答え4
readlink
または、コマンドはありませんがstat
Python 2.xを搭載したシステムでは、短いスクリプトを使用します。
#!/usr/bin/env python
import os, sys
if __name__ == "__main__":
src = sys.argv[1]
target = os.readlink(src)
if not os.path.isabs(target):
target = os.path.abspath(os.path.join(os.path.dirname(src), target))
print target
これreadlink -f
とは異なり、1つのレベルのシンボリックリンクのみに従うことができます。