解決策 1:
-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
解決策 2:
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
解決策 3:
これも機能します:
ls -l /root/Public/myothertextfile.txt
しかし readlink ls を解析するよりも、スクリプトでの使用に適しています。 .
解決策 4:
リンク元とリンク先を表示したい場合は stat -c%N files* を試してください .例
$ stat -c%N /dev/fd/*
‘/dev/fd/0’ -> ‘/dev/pts/4’
‘/dev/fd/1’ -> ‘/dev/pts/4’
解析には適していません (readlink を使用) そのため)、しかし、ls -l の乱雑さなしに、リンク名とリンク先が表示されます
-c --format と書くことができます と %N 「シンボリックリンクの場合、逆参照付きの引用されたファイル名」を意味します。
解決策 5:
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}"
}