web-dev-qa-db-ja.com

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

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

51
gerrit

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

例えば。

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

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

-maxdepthは、findがディレクトリである場合にbがディレクトリに降りないようにするために必要です。

18
Coroos

GNU findfind src -Prune -printf "%l\n"

3
gerrit

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

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}"
}
1
Léa Gris

移植性:ヒューリスティックを使用してls -l出力を解析するか、Perl -le 'print readlink("some-file")'を使用する以外は運がない

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

stat/statシステムコールのラッパーとしてのlstatコマンドのさまざまな実装があります。 GNU oneはその点では役に立ちませんが、zshの組み込みの方がより便利です。

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

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レベルのシンボリックリンクのみに従う場合があることに注意してください。

1
rakslice

realpathパッケージのcoreutilsコマンド、

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


例えば:

realpath /bin/python

出力

/usr/bin/python2.7

私のマシンで。

0
user86041