Řešení 1:
Použijte -f
příznak pro tisk kanonizované verze. Například:
readlink -f /root/Public/myothertextfile.txt
Od man readlink
:
-f, --canonicalize
canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist
Řešení 2:
readlink je příkaz, který chcete. Měli byste se podívat na manuálovou stránku příkazu. Protože pokud chcete sledovat řetězec symbolických odkazů na skutečný soubor, pak potřebujete přepínač -e nebo -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
Řešení 3:
Toto bude také fungovat:
ls -l /root/Public/myothertextfile.txt
ale readlink
by bylo upřednostňováno pro použití ve skriptu před analýzou ls
.
Řešení 4:
Pokud chcete zobrazit zdroj a cíl odkazu, zkuste stat -c%N files*
. Např.
$ stat -c%N /dev/fd/*
‘/dev/fd/0’ -> ‘/dev/pts/4’
‘/dev/fd/1’ -> ‘/dev/pts/4’
Není to dobré pro analýzu (použijte readlink
za to), ale zobrazuje název a cíl odkazu bez změti ls -l
-c
lze zapsat --format
a %N
znamená „název souboru v uvozovkách s dereferencí v případě symbolického odkazu“.
Řešení 5:
readlink
je dobrá věc, ale je specifická pro GNU a není multiplatformní. Kdysi jsem psal skripty pro různé platformy pro /bin/sh
, proto bych použil něco jako:
ls -l /root/Public/myothertextfile.txt | awk '{print $NF}'
nebo:
ls -l /root/Public/myothertextfile.txt | awk -F"-> " '{print $2}'
ale je třeba je otestovat na různých platformách. Myslím, že budou fungovat, ale nejsem si 100% jistý pro ls
výstupní formát.
Výsledek ls
lze také analyzovat v rámci bash
bez závislosti na externím příkazu jako awk
, sed
nebo perl
.
Toto bash_realpath
funkce, řeší konečný cíl odkazu (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}"
}