Solución 1:
Utilice el -f
bandera para imprimir la versión canonicalizada. Por ejemplo:
readlink -f /root/Public/myothertextfile.txt
Desde man readlink
:
-f, --canonicalize
canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist
Solución 2:
readlink es el comando que desea. Debe buscar en la página del manual para el comando. Porque si desea seguir una cadena de enlaces simbólicos al archivo real, necesita el modificador -e o -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
Solución 3:
Esto también funcionará:
ls -l /root/Public/myothertextfile.txt
pero readlink
sería preferible para usar en un script en lugar de analizar ls
.
Solución 4:
Si desea mostrar el origen y el destino del enlace, intente stat -c%N files*
. Por ejemplo
$ stat -c%N /dev/fd/*
‘/dev/fd/0’ -> ‘/dev/pts/4’
‘/dev/fd/1’ -> ‘/dev/pts/4’
No es bueno para analizar (use readlink
para eso), pero muestra el nombre del enlace y el destino, sin el desorden de ls -l
-c
se puede escribir --format
y %N
significa "nombre de archivo entrecomillado sin referencia si es un enlace simbólico".
Solución 5:
El readlink
es algo bueno, pero específico de GNU y no multiplataforma. Solía escribir scripts multiplataforma para /bin/sh
, por lo tanto, usaría algo como:
ls -l /root/Public/myothertextfile.txt | awk '{print $NF}'
o:
ls -l /root/Public/myothertextfile.txt | awk -F"-> " '{print $2}'
pero estos deben probarse en diferentes plataformas. Creo que funcionarán, pero no estoy 100 % seguro para ls
formato de salida.
El resultado de ls
también se puede analizar dentro de bash
sin depender de un comando externo como awk
, sed
o perl
.
Este bash_realpath
función, resuelve el destino final de un enlace (enlace→enlace→enlace→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}"
}