解決策 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}"
}