Descubra el objetivo del enlace simbólico a través de la línea de comando

130

Digamos que configuré un enlace simbólico:

ln -s /root/Public/mytextfile.txt /root/Public/myothertextfile.txt

¿hay alguna manera de ver cuál es el objetivo de myothertextfile.txtusar la línea de comando?

Jared
fuente

Respuestas:

171

Use la -fbandera 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
brian-brasil
fuente
8
Como se sugiere en otra pregunta , es posible que desee utilizar readlink -f.
Denilson Sá Maia
55
Para conseguir este trabajo en Mac OS X, brew install coreutils. Esto instala versiones básicas de GNU de comandos con el prefijo de la letra g, es decirgreadlink -f somefile
Mike D
con el modificador -f, comando devuelve nada en mi caso ..
sotn
El uso de -f me dio la información que quería, es decir, resolver múltiples enlaces simbólicos y mostrar el objetivo final.
isapir
en 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".
Sam Kamensky
23

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
Kyle Brandt
fuente
No hay nada malo con la primera respuesta, pero esta es más completa y útil.
Mike S
6

Esto también funcionará:

ls -l /root/Public/myothertextfile.txt

pero readlinksería preferible usarlo en un script en lugar de analizarlo ls.

Dennis Williamson
fuente
4

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 readlinkpara eso), pero muestra el nombre del enlace y el destino, sin el desorden dels -l

-cpuede escribirse --formaty %Nsignifica "nombre de archivo citado con desreferencia si es un enlace simbólico".

Robert Siemer
fuente
2

El readlinkes 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 lsformato de salida.

El resultado de lstambién se puede analizar bashsin depender de un comando externo como awk, sedo perl.

Esta bash_realpathfunció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}"
}
Роман Коптев
fuente
1

Si no puede usar readlink, entonces el análisis del resultado ls -lpodrí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 sedpara esto:

ls -l /root/Public/myothertextfile.txt | sed 's/^.* -> //'
/root/Public/mytextfile.txt
7ochem
fuente
1

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

rwhiches mi propia implementación recursiva whichque 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/emacsdevuelve:

    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
    
Nico
fuente
0

llo ls -ldebe enumerar los elementos del directorio, incluido su enlace simbólico y su destino

cd -P /root/Public/myothertextfile.txt (en su caso) debe apuntar a la ruta original

Mantz
fuente
0

Si encuentra el destino de todos los enlaces dentro de una carpeta y su subcarpeta, use el find . -type l -lscomando con el tipo de enlace de la siguiente manera:

[email protected]:~/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 -ldebería funcionar:

[email protected]:~/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
Memin
fuente