Solusi 1:
Gunakan -f tandai untuk mencetak versi yang dikanonikalisasi. Misalnya:
readlink -f /root/Public/myothertextfile.txt
Dari man readlink :
-f, --canonicalize
canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist
Solusi 2:
readlink adalah perintah yang Anda inginkan. Anda harus melihat halaman manual untuk perintah tersebut. Karena jika Anda ingin mengikuti rantai tautan simbolis ke file sebenarnya, maka Anda memerlukan sakelar -e atau -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
Solusi 3:
Ini juga akan berfungsi:
ls -l /root/Public/myothertextfile.txt
tapi readlink akan lebih disukai untuk digunakan dalam skrip daripada mem-parsing ls .
Solusi 4:
Jika Anda ingin menampilkan sumber dan tujuan tautan, coba stat -c%N files* . Mis.
$ stat -c%N /dev/fd/*
‘/dev/fd/0’ -> ‘/dev/pts/4’
‘/dev/fd/1’ -> ‘/dev/pts/4’
Itu tidak baik untuk parsing (gunakan readlink untuk itu), tetapi itu menunjukkan nama tautan dan tujuan, tanpa kekacauan ls -l
-c dapat ditulis --format dan %N berarti “nama file yang dikutip dengan dereferensi jika tautan simbolis”.
Solusi 5:
readlink adalah hal yang baik, tetapi platform khusus GNU dan non lintas. Saya biasa menulis skrip lintas platform untuk /bin/sh , oleh karena itu saya akan menggunakan sesuatu seperti:
ls -l /root/Public/myothertextfile.txt | awk '{print $NF}'
atau:
ls -l /root/Public/myothertextfile.txt | awk -F"-> " '{print $2}'
tetapi ini perlu diuji pada platform yang berbeda. Saya pikir mereka akan bekerja, tetapi tidak 100% yakin untuk ls format keluaran.
Hasil dari ls juga dapat diuraikan dalam bash tanpa bergantung pada perintah eksternal seperti awk , sed atau perl .
bash_realpath ini fungsi, menyelesaikan tujuan akhir dari sebuah link (link→link→link→final):
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}"
}