Respuestas:
Use la -f
bandera para imprimir la versión canonicalizada. Por ejemplo:
readlink -f /root/Public/myothertextfile.txt
De 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
. Esto instala versiones básicas de GNU de comandos con el prefijo de la letra g
, es decirgreadlink -f somefile
Ubuntu 18.04.1 LTS (Bionic Beaver)
las páginas de manual de readlink hay una nota que dice "Note realpath (1) es el comando preferido para la funcionalidad de canonicalización".
readlink es el comando que deseas. Debería mirar la página del manual para el comando. Porque si desea seguir una cadena de enlaces simbólicos al archivo real, entonces 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
Esto también funcionará:
ls -l /root/Public/myothertextfile.txt
pero readlink
sería preferible usarlo en un script en lugar de analizarlo ls
.
Si desea mostrar el origen y el destino del enlace, intente stat -c%N files*
. P.ej
$ stat -c%N /dev/fd/*
‘/dev/fd/0’ -> ‘/dev/pts/4’
‘/dev/fd/1’ -> ‘/dev/pts/4’
No es bueno para analizar (usar readlink
para eso), pero muestra el nombre del enlace y el destino, sin el desorden dels -l
-c
puede escribirse --format
y %N
significa "nombre de archivo citado con desreferencia si es un enlace simbólico".
El readlink
es una buena cosa, pero GNU-específica y la plataforma no cruz. 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 ser probados en diferentes plataformas. Creo que funcionarán, pero no estoy 100% seguro del ls
formato de salida.
El resultado de ls
también se puede analizar bash
sin depender de un comando externo como awk
, sed
o perl
.
Esta 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}"
}
Si no puede usar readlink
, entonces el análisis del resultado ls -l
podría hacerse así.
El resultado normal sería:
ls -l /root/Public/myothertextfile.txt
lrwxrwxrwx 1 root root 30 Jan 1 12:00 /root/Public/myothertextfile.txt -> /root/Public/mytextfile.txt
Por lo tanto, queremos reemplazar todo antes de "->" y la flecha incluida. Podríamos usar sed
para esto:
ls -l /root/Public/myothertextfile.txt | sed 's/^.* -> //'
/root/Public/mytextfile.txt
La pregunta no es lo suficientemente precisa como para dar una respuesta simple como la de brian-brazil:
readlink -f some_path
de hecho desreferenciará cada enlace simbólico involucrado en la construcción de la ruta al objetivo final detrás some_path
.
Pero un nivel de enlaces simbólicos en cascada es solo un caso particular entre otros en un sistema, el caso general es N niveles de enlaces simbólicos en cascada. Mira lo siguiente en mi sistema:
$ rwhich emacs
/usr/bin/emacs
/etc/alternatives/emacs
/usr/bin/emacs24-x
rwhich
es mi propia implementación recursiva which
que imprime todos los enlaces simbólicos en cascada intermedios (a stderr) hasta el objetivo final (a stdout).
Entonces si quiero saber qué es:
el objetivo de symlink / usr / bin / emacs **, la respuesta obvia para mí es la que me /etc/alternatives/emacs
devuelve:
readlink $(which emacs)
readlink /usr/bin/emacs
El objetivo final detrás de los enlaces simbólicos en cascada / usr / bin / emacs, la respuesta será la siguiente /usr/bin/emacs24-x
:
readlink -f $(which emacs)
readlink -f /usr/bin/emacs
rwhich emacs 2>/dev/null
Si encuentra el destino de todos los enlaces dentro de una carpeta y su subcarpeta, use el find . -type l -ls
comando con el tipo de enlace de la siguiente manera:
me@local.localdomain:~/test$ find . -type l -ls
8601855888 0 lrwxr-xr-x 1 me staff 6 Jan 24 19:53 ./link -> target
Si desea el objetivo de un solo, entonces ls -l
debería funcionar:
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
.