Linux / Comando / readlink: consultar el destino de un enlace simbólico

readlink es un comando que imprime la ruta de destino almacenada en un archivo de enlace simbólico. Es útil para verificar si el enlace contiene una ruta relativa o hacia qué ubicación apunta un enlace roto.

GNU readlink también admite la normalización de rutas con -f, -e y -m, pero GNU Coreutils recomienda usar realpath para la normalización de rutas común, ya que tiene un nombre más claro y funciones más precisas.

¿Qué es el comando readlink?

Cuando se especifica un enlace simbólico como argumento, imprime la cadena de destino almacenada en el enlace.

readlink current

Si el enlace current apunta a releases/2026-09, se imprimirá de la siguiente manera.

releases/2026-09

Este valor puede ser una ruta relativa que se interpreta en relación con la ubicación del enlace. El readlink básico muestra la cadena almacenada sin convertirla a una ruta absoluta.

Sintaxis y uso básico

readlink [OPCIONES] ARCHIVO ...

Practique en una carpeta nueva de su propiedad, sin un elemento previo llamado current. El siguiente ln -s guarda el destino releases/2026-09 aunque este todavía no exista: readlink sin opciones puede mostrar esa cadena. Para probar -e, prepare primero el destino real.

ln -s releases/2026-09 current
readlink current

Si se especifica un archivo o directorio normal sin opciones, no hay un valor de destino del enlace, por lo que no se imprime y falla con un estado de salida distinto de 0.

readlink /etc/passwd
printf '%s\n' "$?"

Comprender los enlaces relativos y absolutos

Enlaces que guardan rutas relativas

El objetivo de un enlace relativo se interpreta según el directorio donde se encuentra el enlace, no según la ubicación actual del terminal.

ln -s ../shared/config.yml /srv/app/config.yml
readlink /srv/app/config.yml

Este ejemplo presupone que /srv/app existe y que puede crear el enlace allí; no lo aplique sobre una configuración operativa. La cadena ../shared/config.yml, interpretada desde /srv/app, designa /srv/shared/config.yml. Puede practicar la misma estructura bajo una carpeta propia.

Enlaces que guardan rutas absolutas

ln -s /srv/releases/2026-09 /srv/current
readlink /srv/current

Un enlace absoluto genera una cadena de destino que comienza desde la raíz, como se muestra a continuación.

/srv/releases/2026-09

Los enlaces absolutos tienen una ubicación clara, pero es fácil que se rompan si se mueve el árbol de archivos a otra ruta. Debe elegir entre enlaces relativos y absolutos considerando la estructura de distribución y la posibilidad de moverlos.

Comprobar enlaces simbólicos no resolubles

Incluso si no existe el archivo de destino, si el enlace simbólico en sí permanece, readlink puede leer la cadena de destino almacenada.

ln -s missing-target broken-link
readlink broken-link
missing-target

La existencia del destino del enlace puede verificarse por separado de la siguiente manera.

if [ -L broken-link ] && [ ! -e broken-link ]; then
  printf '%s\n' 'El destino del enlace no está disponible.'
fi

-L verifica la existencia del enlace en sí, mientras que -e verifica la existencia del destino siguiendo el enlace. Los problemas de permisos o las circulaciones de enlaces también pueden afectar los resultados.

Opciones de normalización de rutas

GNU readlink proporciona un modo para normalizar rutas además de mostrar la cadena del destino del enlace.

Opciones Funcionamiento
-f, --canonicalize El camino debe existir excepto por el último componente, y se interpretan los enlaces simbólicos y los componentes de punto.
-e, --canonicalize-existing Todos los componentes, incluido el último, deben existir.
-m, --canonicalize-missing También se asume que los componentes que no existen son directorios a fin de normalizar la ruta.

Imprimir la ruta normalizada con -f

readlink -f /srv/current/config.yml

Se imprimirá la ruta absoluta con el manejo de enlaces simbólicos y ., ... El último elemento puede estar ausente, pero los componentes anteriores deben existir.

Requerir la existencia de todos los componentes con -e

readlink -e /srv/current/config.yml

La ruta completa, incluyendo el archivo de destino, debe existir para que se produzca el resultado. No evita la condición de carrera en la que el destino puede cambiar entre la verificación de existencia y el uso real.

Normalizar incluso rutas inexistentes con -m

readlink -m /srv/future/../uploads/new-file.txt

También se procesan los componentes intermedios que no existen, por lo que se puede usar para planificación de rutas o limpieza de cadenas. No hay garantía de que la ubicación impresa pueda ser creada realmente.

Manejo de múltiples enlaces y separación de salida

Verificar múltiples enlaces simbólicos

GNU readlink puede recibir varios enlaces a la vez.

readlink current previous config-link

Cada destino se imprime en una línea. Los nombres del ejemplo current, previous y config-link deben corresponder a enlaces de prueba. El bucle omite los errores mediante continue; no demuestra que todos hayan sido leídos. Además, $(...) elimina los saltos de línea finales. Para conservar destinos arbitrarios, utilice una salida delimitada por NUL sin capturarla así.

for link in current previous config-link; do
  target=$(readlink -- "$link") || continue
  printf '%s -> %s\n' "$link" "$target"
done

Diferencia entre -n y -z

-n o --no-newline omiten el carácter separador al final de la salida al procesar un solo enlace. Puede aparecer una advertencia si se usa con varios archivos.

readlink -n current

-z o --zero imprimen un carácter NUL al final de cada resultado en lugar de un salto de línea. En la automatización donde los nombres de archivo o los destinos de los enlaces pueden contener saltos de línea, -z es más claro.

readlink -z current previous

Comparación entre readlink, realpath, ls y stat

Comando Objetivo principal Características
readlink Verificar la cadena de destino almacenada en el enlace Incluso los enlaces rotos pueden ser leídos por sí mismos
realpath Normalización de nombres de archivo y cálculo de rutas relativas GNU Coreutils recomienda realpath para la canonicalización general de rutas.
ls -l Verifique enlaces y objetivos de manera legible para humanos desde la lista Mostrado junto con otra información de la lista, no apto para análisis
stat Verificación de metadatos detallados de enlaces o objetivos Se pueden comprobar inodo, permisos, tiempo y tipo de archivo

Si en la automatización solo se necesita la cadena de destino del enlace, readlink es adecuado. Si el propósito es la normalización general de rutas y la conversión a rutas relativas, realpath es más claro.

Uso en scripts de shell

Verificar si el objetivo del enlace es una ruta relativa

target=$(readlink -- "$link") || {
  printf '%s\n' 'No se puede leer el enlace simbólico.' >&2
  exit 1
}

case "$target" in
  /*) printf '%s\n' 'El enlace guarda una ruta absoluta.' ;;
  *)  printf '%s\n' 'El enlace guarda una ruta relativa.' ;;
esac

Antes del bloque anterior, asigne link='current' en la misma sesión de Bash, o sustitúyalo por un enlace existente que pueda leer. El bloque clasifica la cadena almacenada: una ruta relativa se interpreta desde el directorio que contiene el enlace, no desde el directorio de trabajo del proceso.

Verificar el estado de salida

En lugar de solo verificar si la salida está vacía, compruebe si el comando se ejecutó correctamente. El destino del enlace no puede ser una cadena vacía, pero puede expresar la intención de manejo de errores de manera más clara.

if target=$(readlink -- "$link"); then
  printf '%s\n' "$target"
else
  printf 'No se pudo leer el enlace: %s\n' "$link" >&2
fi

Resumen de opciones principales

Opciones Descripción
-f, --canonicalize Resuelve la ruta y permite que falte únicamente el último componente.
-e, --canonicalize-existing Todos los componentes de la ruta deben existir para que tenga éxito.
-m, --canonicalize-missing También trata los componentes que no existen como directorios.
-n, --no-newline Omite el carácter de separación de salida después de un solo resultado.
-z, --zero Termina cada resultado con un carácter NUL.
-q, -s, --quiet Suprime la mayoría de los mensajes de error.
-v, --verbose Muestra mensajes de error.

Problemas comunes

Falla sin ninguna salida

En el modo predeterminado, la ruta especificada puede no ser un enlace simbólico o puede que no se pueda acceder al enlace en sí. Verifique el estado de salida y, si es necesario, muestre el mensaje de error con -v.

El destino relativo del enlace parece incorrecto

La ruta relativa mostrada debe interpretarse en función del directorio donde se encuentra el enlace. No se basa en el directorio desde el que se ejecutó el comando.

readlink -f no funciona en otros sistemas

Las opciones de normalización, incluido -f, tienen diferencias de implementación. En scripts que requieren portabilidad, verifique si el sistema operativo de destino las admite y, si el objetivo es la normalización de rutas, compare también las implementaciones y opciones disponibles de realpath.

FAQ

¿readlink lee el contenido del archivo al que apunta un enlace simbólico?

No. En el modo predeterminado, imprime la cadena de ruta de destino almacenada en el archivo de enlace. No lee el contenido del archivo de destino.

¿Se puede verificar un enlace simbólico roto con readlink?

Si el enlace existe y se puede leer, readlink sin opciones muestra la cadena de destino guardada en él. La normalización con -e solo tiene éxito si también existe el destino real.

Si se imprime la ruta relativa, ¿cómo puedo verificar la ruta absoluta?

En un entorno GNU puede utilizar readlink -f ENLACE, pero para normalizar rutas en general, realpath expresa mejor la operación y ofrece opciones más específicas.

¿Por qué usar readlink en lugar de ls -l?

ls -l es adecuado para consultar una lista legible por personas; readlink muestra solo la cadena de destino y resulta útil en scripts. En la automatización, gestione también el estado de salida y los delimitadores de los nombres de archivo.

Para ampliar la consulta de metadatos y comparar herramientas, consulte Linux / Comando / stat - Ver información y metadatos del archivo y Lista de comandos de uso frecuente en Linux.

Para las condiciones exactas de canonicalización, consulte Documentación oficial de GNU Coreutils readlink y Documentación oficial de GNU Coreutils realpath.