Qué es ln

ln crea enlaces entre archivos. Un enlace es un nombre adicional que apunta a los mismos datos. Linux soporta dos tipos: enlaces duros (hard links) y enlaces simbólicos (symlinks).

Enlaces duros vs enlaces simbólicos

Para entender la diferencia, es útil saber que los archivos en Linux tienen dos partes: un inodo (metadatos + puntero a los datos) y los datos en sí. Un nombre de archivo es simplemente un puntero a un inodo.

Enlace duro — un segundo nombre de archivo que apunta al mismo inodo:

  • Ambos nombres son iguales; ninguno es "el original"
  • Borrar un nombre deja el otro intacto — los datos sobreviven hasta que se elimina el último nombre
  • No puede cruzar sistemas de archivos diferentes
  • No puede apuntar a directorios

Enlace simbólico — un archivo especial que contiene la ruta a otro archivo:

  • Borrar el destino rompe el symlink (enlace colgante)
  • Puede cruzar sistemas de archivos
  • Puede apuntar a directorios
  • Aparece como l en ls -la

Crear un enlace simbólico

ln -s destino nombre_enlace

Ejemplos:

ln -s /etc/nginx/sites-available/misitiow /etc/nginx/sites-enabled/misitio
ln -s /opt/miapp/bin/miapp /usr/local/bin/miapp
ln -s ~/dotfiles/.bashrc ~/.bashrc

Crear un enlace duro

ln destino nombre_enlace

Ejemplo:

ln informe.pdf informe-copia.pdf

Ahora ambos archivos comparten el mismo inodo. Los cambios en cualquiera de los dos son visibles en el otro.

Enlazar un directorio (solo symlink)

ln -s /data/media /home/usuario/media

Los enlaces duros a directorios no están permitidos (excepto . y .. que mantiene el kernel).

Verificar los enlaces

ls -la

Un symlink aparece como:

lrwxrwxrwx 1 usuario usuario 22 Jul  7 10:00 miapp -> /opt/miapp/bin/miapp

Ver a qué apunta un symlink:

readlink /usr/local/bin/miapp
readlink -f /usr/local/bin/miapp   # resuelve todos los symlinks, muestra ruta absoluta

Sobrescribir un enlace existente

ln -sf nuevo_destino nombre_enlace

El flag -f elimina el enlace existente antes de crear el nuevo.

Ejemplos prácticos

Gestionar virtual hosts en Nginx (el patrón de Debian/Ubuntu):

ln -s /etc/nginx/sites-available/ejemplo.com /etc/nginx/sites-enabled/

Poner un script en el PATH sin moverlo:

ln -s ~/scripts/deploy.sh /usr/local/bin/deploy

Mantener dotfiles en un directorio con control de versiones:

ln -s ~/dotfiles/.vimrc ~/.vimrc
ln -s ~/dotfiles/.bashrc ~/.bashrc

Cambiar entre versiones de Python:

ln -sf /usr/bin/python3.12 /usr/local/bin/python3

Ver también

man ln, readlink(1), stat(1) — verificá los números de inodo con stat archivo para confirmar que dos nombres comparten el mismo inodo.

  • Creado: 16 de mayo de 2007
  • Última edición: 7 de julio de 2026