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}"
}