Jawaban:
Gunakan -f
bendera untuk mencetak versi kanonik. Sebagai contoh:
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
brew install coreutils
,. Ini menginstal versi gnu dasar dari perintah yang diawali dengan huruf g
, yaitugreadlink -f somefile
Ubuntu 18.04.1 LTS (Bionic Beaver)
halaman readlink ada catatan yang mengatakan "Note realpath (1) adalah perintah yang disukai untuk digunakan untuk fungsionalitas kanonikisasi."
readlink adalah perintah yang Anda inginkan. Anda harus melihat halaman manual untuk perintah. Karena jika Anda ingin mengikuti rantai tautan simbolik ke file aktual, 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
Ini juga akan berfungsi:
ls -l /root/Public/myothertextfile.txt
tetapi readlink
akan lebih disukai untuk digunakan dalam skrip daripada parsing ls
.
Jika Anda ingin menunjukkan sumber dan tujuan tautan, coba stat -c%N files*
. Misalnya
$ stat -c%N /dev/fd/*
‘/dev/fd/0’ -> ‘/dev/pts/4’
‘/dev/fd/1’ -> ‘/dev/pts/4’
Ini tidak baik untuk parsing (gunakan readlink
untuk itu), tetapi itu menunjukkan nama tautan dan tujuan, tanpa kekacauanls -l
-c
dapat ditulis --format
dan %N
berarti "nama file yang dikutip dengan dereferensi jika tautan simbolik".
Ini readlink
adalah hal yang baik, tetapi platform khusus GNU dan non lintas. Saya biasa menulis skrip lintas platform /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 output.
Hasil dari ls
juga dapat diuraikan di dalam bash
tanpa tergantung pada perintah eksternal seperti awk
, sed
atau perl
.
bash_realpath
Fungsi ini , menyelesaikan tujuan akhir suatu tautan (tautan → tautan → tautan → 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}"
}
Jika Anda tidak dapat menggunakan readlink
, maka penguraian hasil ls -l
dapat dilakukan seperti ini.
Hasil normal adalah:
ls -l /root/Public/myothertextfile.txt
lrwxrwxrwx 1 root root 30 Jan 1 12:00 /root/Public/myothertextfile.txt -> /root/Public/mytextfile.txt
Jadi kami ingin mengganti semuanya sebelum "->" dan panah disertakan. Kita bisa menggunakan sed
ini:
ls -l /root/Public/myothertextfile.txt | sed 's/^.* -> //'
/root/Public/mytextfile.txt
Pertanyaannya tidak cukup akurat untuk memberikan jawaban sederhana seperti brian-brazil:
readlink -f some_path
memang akan melakukan dereferensi setiap symlink yang terlibat dalam path membangun ke target akhir di belakang some_path
.
Tetapi satu level dari symlink cascading hanyalah sebuah kasus khusus di antara yang lain dalam suatu sistem, kasus yang umum adalah level N dari symlink cascading. Lihatlah yang berikut di sistem saya:
$ rwhich emacs
/usr/bin/emacs
/etc/alternatives/emacs
/usr/bin/emacs24-x
rwhich
adalah implementasi rekursif saya sendiri which
yang mencetak semua symlink cascading menengah (ke stderr) ke target akhir (ke stdout).
Maka jika saya ingin tahu apa itu:
target symlink / usr / bin / emacs **, jawaban yang jelas bagi saya adalah /etc/alternatives/emacs
dikembalikan oleh:
readlink $(which emacs)
readlink /usr/bin/emacs
yang akhir sasaran belakang Cascading symlink / usr / bin / emacs, jawabannya akan /usr/bin/emacs24-x
seperti dikembalikan oleh:
readlink -f $(which emacs)
readlink -f /usr/bin/emacs
rwhich emacs 2>/dev/null
Jika Anda menemukan target semua tautan di dalam folder dan subfoldernya gunakan find . -type l -ls
perintah dengan tipe tautan sebagai berikut:
me@local.localdomain:~/test$ find . -type l -ls
8601855888 0 lrwxr-xr-x 1 me staff 6 Jan 24 19:53 ./link -> target
Jika Anda ingin target satu, maka ls -l
harus berfungsi:
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
.