シンボリックリンクの宛先のみを検索


50

シェルスクリプトで使用するために、シンボリックリンクのリンク先を取得するためのコマンドラインを探しています。私がこれまで来た一番近いのはstat -N src、出力src -> dstです。もちろん、出力を解析してgetを実行することもできますdstが、宛先を取得する直接的な方法はあるのでしょうか。

回答:


61

別のオプションは、特別に設計されたコマンドを使用することreadlinkです。

例えば

$ readlink -f `command -v php`
/usr/bin/php7.1

21
次のシンボリックリンクターゲットだけでなくreadlink -f最後のシンボリックリンクターゲットを知りたい場合に使用します。
scai

いい視点ね!忘れてた
-nikitautiu

11
-fGNUへの非ポータブル拡張ですreadlink
バハマ

2
readlinkはいつ利用できなくなりますか?ありがとう。
tommy.carstensen

2
@ tommy.carstensen readlink(1)は2003年にGNU coreutilsに追加されたため、最近ではcoreutilsを使用するほぼすべてのシステムに依存する可能性があります。(参照、git.savannah.gnu.org/cgit/coreutils.git/commit/src/...
ヨシップ・ロダン

16

Mac OS XおよびFreeBSD / NetBSD / etcで。それは:

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

これ-maxdepthfindbたまたまディレクトリである場合にディレクトリに降りることを防ぐために必要です。


私は完全にざっと目を通しました、stat --printf='%N\n'まさに私が望むものです、奇妙な引用は私を気にしません、それらは同じ引用rmと
ln-インタラクティブな

Linuxでは、GNU coreutilsのstat(1)のパラメーターが異なりlink -> dest、出力に出力されるため、これは明らかに移植性がありません。それはGNUののfindutilsでだかそうでない場合のfind(1)ソリューションは...チェックする必要があります
ヨシップ・ロダン

、あなたの変数の展開を引用することを忘れないでくださいecho $f確かにあなたが期待するものを生成しないときにシンボリックリンクポイント/*(はい、それは可能です)
Camusensei

3

これはGNUを使用して実行できますfindfind src -prune -printf "%l\n"


1

移植性:ヒューリスティックを使用してls -l出力を解析するか、または perl -le 'print readlink("some-file")'

一部のシステムにはreadlinkコマンドがあり、一部のシステムには-f絶対パスを取得するオプションがあります。

/ システムコールのstatラッパーとして、コマンドのさまざまな実装があります。GNUのものはその点では有用ではありませんが、zshの組み込みのものはより有用です。statlstat

zmodload zsh/stat
stat +link the-link

引き続きzshを使用すると、:A修飾子(変数展開、履歴展開、グロビングに適用)を使用してファイルの絶対パスを取得できます(すべてのsymlinkコンポーネントを削除します)。

~$ gstat -c %N b
`b' -> `a'
~$ var=b
~$ echo $var:A
/home/me/a
~$ echo b(:A)
/home/me/a
~$ echo ?(@:A)
/home/me/a

1

コマンドreadlinkstatコマンドがないのに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つだけであることに注意してください。


1

ポータブルピュアバッシュリアルパス

bash_realpath() {
  # print the resolved path
  # @params
  # 1: the path to resolve
  # @return
  # &1: the resolved link path

  local path="${1}"
  while [[ -L ${path} && "$(ls -l "${path}")" =~ -\>\ (.*) ]]
  do
    path="${BASH_REMATCH[1]}"
  done
  echo "${path}"
}

0

realpathcoreutilsパッケージのコマンド、

readlinkコマンドのマニュアルページにリンクされています。


例えば:

realpath /bin/python

出力

/usr/bin/python2.7

私のマシンで。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.