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
lenls -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