回答:
-f
フラグを使用して、正規化されたバージョンを印刷します。例えば:
readlink -f /root/Public/myothertextfile.txt
からman readlink
:
-f, --canonicalize
canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist
brew install coreutils
。これは、文字で始まるコマンドの基本的なGNUバージョンのインストールg
、すなわちgreadlink -f somefile
Ubuntu 18.04.1 LTS (Bionic Beaver)
READLINKのmanページと言ってノートを持っている「ノートのrealpath(1)正規化機能のために使用することが好ましいコマンドです。」
readlinkは必要なコマンドです。コマンドのマニュアルページをご覧ください。実際のファイルへのシンボリックリンクのチェーンを追跡する場合は、-eまたは-fスイッチが必要なためです。
$ ln -s foooooo zipzip # fooooo doesn't actually exist
$ ln -s zipzip zapzap
$ # Follows it, but doesn't let you know the file doesn't actually exist
$ readlink -f zapzap
/home/kbrandt/scrap/foooooo
$ # Follows it, but file not there
$ readlink -e zapzap
$ # Follows it, but just to the next symlink
$ readlink zapzap
zipzip
これも機能します:
ls -l /root/Public/myothertextfile.txt
しかしreadlink
、構文解析よりもスクリプトでの使用に適していますls
。
これreadlink
は良いことですが、GNU固有の非クロスプラットフォームです。のクロスプラットフォームスクリプトを記述していたため/bin/sh
、次のようなものを使用します。
ls -l /root/Public/myothertextfile.txt | awk '{print $NF}'
または:
ls -l /root/Public/myothertextfile.txt | awk -F"-> " '{print $2}'
しかし、これらは異なるプラットフォームでテストする必要があります。それらは機能すると思いますが、ls
出力形式が100%確実ではありません。
の結果は、またはのような外部コマンドに依存せずls
に解析することもできます。bash
awk
sed
perl
このbash_realpath
関数は、リンクの最終宛先を解決します(リンク→リンク→リンク→最終):
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}"
}
を使用できない場合readlink
、結果の解析は次のls -l
ように行うことができます。
通常の結果は次のとおりです。
ls -l /root/Public/myothertextfile.txt
lrwxrwxrwx 1 root root 30 Jan 1 12:00 /root/Public/myothertextfile.txt -> /root/Public/mytextfile.txt
そのため、「->」と含まれる矢印の前のすべてを置き換えます。sed
これに使用できます:
ls -l /root/Public/myothertextfile.txt | sed 's/^.* -> //'
/root/Public/mytextfile.txt
質問は、brian-brazilのような単純な答えを出すほど正確ではありません。
readlink -f some_path
実際には、パス構造に関係するすべてのシンボリックリンクを背後の最終ターゲットに逆参照しsome_path
ます。
しかし、カスケードシンボリックリンクの1つのレベルは、システム内の他の特定のケースにすぎず、一般的なケースはカスケードシンボリックリンクのNレベルです。私のシステムで次を見てください:
$ rwhich emacs
/usr/bin/emacs
/etc/alternatives/emacs
/usr/bin/emacs24-x
rwhich
これは、which
中間カスケードシンボリックリンクのすべて(stderrへ)を最終ターゲット(stdoutへ)に出力する、独自の再帰的な実装です。
次に、何が知りたい場合:
シンボリックリンク / usr / bin / emacs ** のターゲット、私への明白な答えは次の/etc/alternatives/emacs
ように返されます:
readlink $(which emacs)
readlink /usr/bin/emacs
カスケードシンボリックリンク / usr / bin / emacsの背後にある最終ターゲット。答えは次のよう/usr/bin/emacs24-x
に返されます。
readlink -f $(which emacs)
readlink -f /usr/bin/emacs
rwhich emacs 2>/dev/null
フォルダーとそのサブフォルダー内のすべてのリンクのターゲットが見つかった場合find . -type l -ls
、次のようにリンクタイプを指定してコマンドを使用します。
me@local.localdomain:~/test$ find . -type l -ls
8601855888 0 lrwxr-xr-x 1 me staff 6 Jan 24 19:53 ./link -> target
単一のターゲットが必要な場合は、次のように動作するls -l
はずです。
me@local.localdomain:~/test$ ls -l
total 0
lrwxr-xr-x 1 me staff 6 Jan 24 19:53 link -> target
-rw-r--r-- 1 me staff 0 Jan 24 19:53 target
readlink -f
。