← Terminal y Línea de Comandos en Linux Bloque 3 · Manipular archivos y directorios · Tema 14 de 43

Tema 14

Enlaces duros y simbólicos

Hasta aquí tratamos el nombre de un archivo y el archivo como si fueran lo mismo. No lo son, y varias cosas que quedaron sin explicar dependen de esa diferencia: la columna de números de ls -l, que mv sea instantáneo, que /bin lleve a /usr/bin. En este tema vemos cómo guarda Linux los archivos por dentro, y los dos mecanismos que eso hace posibles: que un archivo tenga varios nombres, y que un nombre apunte a otro.

1. Un archivo no es su nombre

En la vida diaria decimos «el archivo notas.txt», como si el nombre fuera el archivo. Para el sistema son tres cosas separadas, guardadas en tres lugares distintos:

PiezaQué esDónde se guarda
El nombreLa etiqueta con la que las personas lo identifican.En el directorio.
El inodoLa ficha con todo lo que el sistema sabe del archivo.En una tabla del sistema de archivos.
Los datosEl contenido.En bloques del disco.

El nombre lleva al inodo, y el inodo lleva a los datos. Una biblioteca funciona igual: el catálogo tiene títulos, cada título remite a una ficha, y la ficha indica en qué estante está el libro. El libro no lleva escrito en qué catálogos figura, y puede figurar en varios.

Dos nombres, original.txt y duro.txt, llevan al mismo inodo, que lleva a los datos: son enlaces duros. Un tercer nombre, blando.txt, lleva a otro inodo que no tiene datos propios sino que guarda la ruta original.txt: es un enlace simbólico original.txt duro.txt blando.txt inodo 1311480 2 enlaces inodo 1311481 no tiene datos: guarda la ruta «original.txt» datos 26 bytes
Arriba, un archivo con dos nombres: dos enlaces duros al mismo inodo. Abajo, un enlace simbólico: un archivo aparte, cuyo contenido es el nombre de otro.

El diagrama adelanta los dos mecanismos del tema. Para entenderlos hay que mirar primero la pieza del medio.

2. El inodo

Un inodo es la estructura en la que el sistema de archivos guarda todos los datos de un archivo, salvo su nombre y su contenido. Cada inodo se identifica con un número, único dentro de su sistema de archivos.

Lo mencionamos en el tema 7, al presentar stat: lo que ese comando muestra es, precisamente, el contenido del inodo.

El inodo guardaEn ls -l se ve como
El tipo: archivo, directorio, enlace…El primer carácter.
Los permisos.Los nueve caracteres siguientes.
La cantidad de nombres que lo señalan.La columna de enlaces.
El dueño y el grupo.Las dos columnas siguientes.
El tamaño.La columna del tamaño.
Las fechas de modificación, acceso y cambio.La fecha.
En qué bloques del disco están los datos.No se muestra.

Lo que no guarda es el nombre. Es lo único de la línea de ls -l que no viene del inodo.

El número de inodo se ve con la opción -i de ls. Preparamos un taller, como en el tema 11, y creamos un archivo:

terminal
$ cd ~/practica
$ mkdir taller
$ cd taller
$ echo "Texto original" > original.txt
$ ls -li
total 4
1311480 -rw-rw-r-- 1 ana ana 15 oct 12 14:05 original.txt

La primera columna es el número de inodo; en tu sistema será otro. La tercera, el contador de enlaces, vale 1: este inodo tiene un solo nombre.

3. Qué es, entonces, un directorio

Si el nombre no está en el inodo, está en el directorio. Y esa es toda la función de un directorio:

Un directorio es un archivo cuyo contenido es una lista de pares: un nombre y el número del inodo al que corresponde. Cada uno de esos pares es un enlace.

NombreInodo
.1311478
..1311401
original.txt1311480

Así es por dentro nuestro directorio taller. No «contiene» archivos en ningún sentido físico: contiene nombres, con una referencia a cada archivo. Con esta idea se explican varios comportamientos que encontramos en temas anteriores:

HechoExplicación
El tamaño de un directorio no incluye el de sus archivos.Mide solo su lista de nombres. Tema 7.
mv es instantáneo dentro del mismo disco.Quita un par de una lista y lo anota en otra. Los datos no se tocan. Tema 11.
Para borrar un archivo hace falta permiso sobre el directorio.Borrar es quitar una línea de la lista del directorio. Tema 11.
Renombrar no cambia la fecha del archivo.El nombre no forma parte del archivo.

4. Enlaces duros: otro nombre para el mismo archivo

Si un nombre es solo una referencia a un inodo, nada impide que haya dos referencias al mismo. El comando ln, de link, crea una:

terminal, en ~/practica/taller
$ ln original.txt duro.txt
$ ls -li
total 8
1311480 -rw-rw-r-- 2 ana ana 15 oct 12 14:05 duro.txt
1311480 -rw-rw-r-- 2 ana ana 15 oct 12 14:05 original.txt

El orden de los argumentos es el de cp: primero lo que ya existe, después el nombre nuevo. El listado muestra dos líneas con el mismo número de inodo, y el contador pasó de 1 a 2.

Un enlace duro es un nombre adicional para un archivo existente. Todos los enlaces duros de un archivo señalan al mismo inodo y son equivalentes entre sí.

No se copió nada. Hay un solo archivo en el disco, con un solo contenido, y dos nombres que llevan a él. La prueba es que lo que se modifica por un nombre se ve por el otro:

terminal
$ echo "Otra frase" >> duro.txt     # agregar una línea usando un nombre…
$ cat original.txt                  # …y leer usando el otro
Texto original
Otra frase
$ ls -li
total 8
1311480 -rw-rw-r-- 2 ana ana 26 oct 12 14:10 duro.txt
1311480 -rw-rw-r-- 2 ana ana 26 oct 12 14:10 original.txt

El tamaño, la fecha, los permisos y el dueño coinciden siempre en las dos líneas, y no por sincronización: son los datos de un único inodo, mostrados dos veces.

Hay un punto que conviene subrayar, porque los nombres del ejemplo inducen a error. No hay un original y una copia. Después de crear el enlace, los dos nombres tienen exactamente el mismo rango, y el sistema no recuerda cuál fue primero. original.txt es tan «enlace duro» como duro.txt: todo nombre de archivo lo es.

5. Lo que rm hace en realidad

La consecuencia más interesante aparece al borrar:

terminal
$ rm original.txt
$ cat duro.txt                      # el contenido sigue ahí
Texto original
Otra frase
$ ls -li
total 4
1311480 -rw-rw-r-- 1 ana ana 26 oct 12 14:10 duro.txt

Se borró el «original», y el archivo está intacto. rm no borra archivos: quita un nombre. Con cada nombre que se quita, el contador del inodo baja en uno. El sistema libera el inodo y los bloques de datos solo cuando el contador llega a cero.

OperaciónEfecto sobre el contador¿Se liberan los datos?
Crear un archivoEmpieza en 1.—
ln a bSube en 1.—
rm de un nombre, quedando otrosBaja en 1.No.
rm del último nombreLlega a 0.Sí.

Por eso la operación interna del sistema se llama unlink, desenlazar, y no «borrar». En el caso habitual, con un solo nombre, quitarlo y eliminar el archivo son lo mismo, y la distinción no se nota.

Hay una condición más para que el espacio se libere: que ningún programa tenga el archivo abierto. De ahí sale un problema clásico de administración. Se borra un registro enorme para recuperar espacio, y el disco sigue lleno: el servicio que lo escribe aún lo tiene abierto, y los datos persisten, ya sin nombre, hasta que ese servicio se reinicie.

Devolvemos al archivo su nombre anterior. Renombrar, como sabemos, tampoco toca el inodo:

terminal
$ mv duro.txt original.txt
$ ls -li
total 4
1311480 -rw-rw-r-- 1 ana ana 26 oct 12 14:10 original.txt

6. Los límites de los enlaces duros

Los enlaces duros tienen dos restricciones, que vienen de su propia naturaleza:

terminal
$ ln ~/practica/fotos album         # a un directorio: no
ln: /home/ana/practica/fotos: hard link not allowed for directory
$ ln original.txt /dev/shm/otro.txt # a otro sistema de archivos: tampoco
ln: failed to create hard link '/dev/shm/otro.txt' => 'original.txt': Invalid cross-device link
RestricciónRazón
No se pueden hacer a directorios.Un directorio con dos padres rompería la forma de árbol: aparecerían ciclos, y los programas que recorren directorios no terminarían nunca.
No pueden cruzar de un sistema de archivos a otro.Un enlace duro es un número de inodo, y los números solo tienen sentido dentro del sistema de archivos que los asignó. Otro disco tiene su propia numeración.

/dev/shm es un directorio que reside en la memoria y no en el disco, de modo que es un sistema de archivos distinto del de tu directorio personal; por eso sirve para la demostración.

La primera restricción tiene una excepción que el propio sistema administra, y que resuelve un asunto pendiente del tema 7: por qué la columna de enlaces de un directorio vale «2 más la cantidad de subdirectorios». Las entradas . y .. son enlaces duros.

terminal
$ mkdir sub
$ ls -ldi . sub/..
1311478 drwxrwxr-x 3 ana ana 4096 oct 12 14:15 .
1311478 drwxrwxr-x 3 ana ana 4096 oct 12 14:15 sub/..

El mismo inodo, alcanzado por dos caminos. El directorio taller tiene tres nombres: taller, en la lista de su padre; ., en su propia lista; y .., en la lista de sub. Cada subdirectorio nuevo agrega otro .., y de ahí la regla.

7. Enlaces simbólicos: un nombre que apunta a otro

El segundo tipo de enlace resuelve las dos limitaciones, con un mecanismo completamente distinto. Se crea con la opción -s:

terminal
$ ln -s original.txt blando.txt
$ ls -li
total 8
1311481 lrwxrwxrwx 1 ana ana 12 oct 12 14:18 blando.txt -> original.txt
1311480 -rw-rw-r-- 1 ana ana   26 oct 12 14:10 original.txt
1311485 drwxrwxr-x 2 ana ana 4096 oct 12 14:15 sub
$ cat blando.txt
Texto original
Otra frase

Un enlace simbólico es un archivo de un tipo especial cuyo contenido es una ruta. Cuando un programa lo abre, el sistema lo reemplaza por el archivo que esa ruta señala.

Todo en el listado lo distingue del enlace duro:

En el listadoSignifica
Un número de inodo distintoEs otro archivo, no otro nombre del mismo.
La l inicialEl tipo: enlace simbólico.
rwxrwxrwxLos permisos del enlace no se usan. Valen los del archivo al que apunta.
El contador de original.txt sigue en 1El destino no «sabe» que alguien lo señala.
El tamaño, 12La longitud de la ruta guardada: original.txt tiene doce caracteres.
La flechaLa ruta a la que apunta.

La penúltima fila resume la idea: el enlace no contiene los datos ni una referencia al inodo, sino un texto. Es el equivalente de un acceso directo de Windows, o de un cartel que dice «lo que busca está en tal lugar».

Hay un tercer nombre en uso para lo mismo. En inglés se los llama symbolic links, abreviado symlinks, o soft links, por oposición a los hard links; en español, simbólicos o blandos.

8. Quién sigue el enlace

La gran mayoría de los comandos siguen el enlace: actúan sobre el archivo señalado, sin que haya que hacer nada. Leer, editar o ejecutar a través de un enlace simbólico es lo mismo que hacerlo sobre el destino. Unos pocos actúan sobre el enlace mismo, y conviene saber cuáles:

Comando sobre el enlaceActúa sobre…
cat, less, nano, wc…El destino.
cp enlace copiaEl destino: la copia es un archivo común, con el contenido.
cp -a enlace copiaEl enlace: la copia es otro enlace.
ls -l enlaceEl enlace. Con -L, el destino.
mv enlace otroEl enlace: lo renombra o lo mueve.
rm enlaceEl enlace: lo borra. El destino no se toca.

La lógica es que los comandos que tratan del contenido siguen el enlace, y los que tratan del nombre —mover, renombrar, borrar— actúan sobre él. Borrar un enlace simbólico es siempre seguro para el archivo original.

Para averiguar adónde lleva un enlace hay dos comandos:

terminal
$ readlink blando.txt               # lo que el enlace tiene escrito
original.txt
$ realpath blando.txt               # el archivo final, como ruta absoluta
/home/ana/practica/taller/original.txt

realpath, que conocimos en el tema 6, resuelve además las cadenas: un enlace puede apuntar a otro enlace, y este a otro. El sistema las sigue hasta el final, con un límite de unos cuarenta saltos para protegerse de los ciclos.

9. Enlaces rotos

Como el enlace simbólico guarda un nombre, y no una referencia al archivo, nada lo mantiene al día. Si el destino se borra, se mueve o cambia de nombre, el enlace queda señalando a la nada:

terminal
$ mv original.txt otro.txt          # el destino cambia de nombre
$ cat blando.txt
cat: blando.txt: No such file or directory
$ ls -l blando.txt                  # el enlace existe; lo que falta es el destino
lrwxrwxrwx 1 ana ana 12 oct 12 14:18 blando.txt -> original.txt
$ mv otro.txt original.txt          # vuelve el nombre…
$ cat blando.txt                    # …y el enlace funciona otra vez
Texto original
Otra frase

El mensaje de cat es confuso, porque nombra a blando.txt, que sí existe. Lo que no existe es aquello a lo que apunta. Es un enlace roto, y ls suele mostrarlo en rojo.

El final del ejemplo muestra la otra cara. Al reaparecer un archivo con ese nombre, el enlace vuelve a funcionar, y funcionaría igual si fuera un archivo completamente distinto. Un enlace simbólico apunta a un nombre, sea cual sea el archivo que lo lleve. Un enlace duro apunta a un archivo, sea cual sea su nombre. Esa es la diferencia esencial entre los dos.

Los enlaces rotos se acumulan con el tiempo. find los localiza:

terminal
$ find ~ -xtype l                   # enlaces simbólicos cuyo destino no existe

10. La trampa de las rutas relativas

El enlace guarda la ruta tal como se la escribió. Si es relativa, surge una pregunta: ¿relativa a qué? La respuesta no es la que se espera, y es la causa de la mayoría de los enlaces rotos recién creados.

Una ruta relativa dentro de un enlace se resuelve desde el directorio donde está el enlace

No desde el directorio de trabajo en el que se ejecutó ln, ni desde el directorio en el que estés al usarlo. El punto de partida es siempre el lugar donde el enlace reside.

Se ve al mover el enlace. Sigue diciendo original.txt, pero ahora ese nombre se busca en otro directorio:

terminal
$ mv blando.txt sub/
$ cat sub/blando.txt                # busca sub/original.txt, que no existe
cat: sub/blando.txt: No such file or directory
$ rm sub/blando.txt

El mismo error se comete al crear un enlace en otro directorio. Parece natural escribir ln -s original.txt sub/blando.txt, porque desde donde estás original.txt es una ruta válida. El enlace nace roto. Hay tres formas correctas:

terminal: tres maneras de crear bien el enlace
$ ln -s ../original.txt sub/blando.txt            # relativa, pensada desde «sub»
$ cat sub/blando.txt
Texto original
Otra frase
$ ln -sr original.txt sub/relativo.txt            # -r: que ln calcule la ruta relativa
$ ln -s ~/practica/taller/original.txt sub/absoluto.txt   # absoluta
$ ls -l sub
total 0
lrwxrwxrwx 1 ana ana 38 oct 12 14:26 absoluto.txt -> /home/ana/practica/taller/original.txt
lrwxrwxrwx 1 ana ana 15 oct 12 14:24 blando.txt -> ../original.txt
lrwxrwxrwx 1 ana ana 15 oct 12 14:25 relativo.txt -> ../original.txt
El enlace guarda una ruta…Sigue funcionando si…Se rompe si…
AbsolutaSe mueve el enlace a cualquier parte.Se mueve el destino, o todo el conjunto se lleva a otro lugar u otra máquina.
RelativaSe mueven juntos el enlace y el destino, conservando sus posiciones.Se mueve solo uno de los dos.

Es el mismo criterio del tema 6. Para enlaces dentro de un proyecto que puede copiarse o moverse entero, relativas; para un atajo personal hacia un lugar fijo del sistema, absolutas. Y después de crear un enlace, comprobarlo: un ls -l o un cat lleva un segundo.

11. Enlaces a directorios

Los enlaces simbólicos sí pueden apuntar a directorios, y es uno de sus usos más frecuentes:

terminal
$ ln -s ~/practica/fotos album
$ ls -ld album
lrwxrwxrwx 1 ana ana 24 oct 12 14:30 album -> /home/ana/practica/fotos
$ cd album
$ pwd                               # la ruta lógica: por donde entré
/home/ana/practica/taller/album
$ pwd -P                            # la ruta física: donde estoy
/home/ana/practica/fotos
$ cd ..                             # vuelve por donde entré: a taller

Es la situación que vimos en el tema 6 con /bin, y ahora se entiende completa. La shell recuerda el camino por el que entraste, y cd .. lo desanda, aunque el padre real de fotos sea otro.

Con los enlaces a directorios, una barra al final cambia el significado de la ruta:

Se escribeSe refiere a
albumEl enlace.
album/El directorio al que apunta.
Para borrar un enlace a un directorio: rm, sin -r y sin barra

rm album quita el enlace y deja intacto el directorio real. El peligro está en rm -r album/*: el asterisco se expande dentro del directorio señalado, y lo que se borra es su contenido verdadero. Recuerda que Tab añade la barra al completar; antes de borrar un enlace, quítala.

terminal
$ rm album                          # solo el enlace; ~/practica/fotos sigue en su lugar

12. Duro, simbólico o copia

Enlace duroEnlace simbólicoCopia
Se crea conln a bln -s a bcp a b
Qué esOtro nombre del mismo archivoUn archivo que contiene una rutaOtro archivo, independiente
InodoEl mismoUno propioUno propio
Espacio que ocupaNinguno adicionalUnos bytesLo mismo que el original
Un cambio en uno se ve en el otroSí: es el mismo archivoSí: se edita el destinoNo
Si se borra el originalSigue funcionandoQueda rotoNo le afecta
A un directorioNoSíCon -r
Entre discos distintosNoSíSí
Se reconoce en ls -lSolo por el contador mayor que 1Por la l y la flechaNo se reconoce

En la práctica, el que se usa a diario es el simbólico. Es más flexible, y sobre todo es visible: cualquiera que liste el directorio ve que es un enlace y adónde va. El enlace duro es discreto hasta el punto de pasar inadvertido, y queda para usos específicos. Ninguno de los dos reemplaza a una copia cuando se quieren dos versiones independientes, ni sirve de respaldo: si el contenido se daña, se daña para todos los nombres.

Para saber qué nombres comparten un inodo, find tiene dos condiciones: -samefile archivo, y -inum número.

13. Dónde se usan

Los enlaces simbólicos están por todo el sistema. Algunos de los que tienes en tu equipo:

terminal (los detalles varían)
$ ls -l /bin /etc/localtime /usr/bin/python3
lrwxrwxrwx 1 root root  7 abr 22  2024 /bin -> usr/bin
lrwxrwxrwx 1 root root 50 oct  5 09:10 /etc/localtime -> /usr/share/zoneinfo/America/Argentina/Buenos_Aires
lrwxrwxrwx 1 root root 10 ago  7  2024 /usr/bin/python3 -> python3.12
UsoEjemploQué resuelve
Compatibilidad/bin → usr/binLas rutas antiguas siguen valiendo tras una reorganización. Tema 8.
Elegir entre alternativas/etc/localtime → un archivo de zona horariaLa configuración es «a cuál apunta el enlace». Cambiar la zona horaria es cambiar el enlace.
Versionespython3 → python3.12Un nombre estable para un programa cuya versión cambia. Al actualizar, se cambia el enlace y nadie nota la diferencia.
Activar y desactivarServidores web: sites-enabled/sitio → ../sites-available/sitioUn sitio se activa creando el enlace y se desactiva borrándolo, sin tocar su configuración.
Atajos personales~/proyecto → una ruta largaLlegar rápido a un lugar profundo del árbol.

El segundo uso está muy desarrollado en Debian y Ubuntu, con el sistema de alternativas. El editor por defecto que mencionamos en el tema 13 es una cadena de enlaces:

terminal (puede variar)
$ readlink /usr/bin/editor
/etc/alternatives/editor
$ readlink /etc/alternatives/editor
/bin/nano
$ realpath /usr/bin/editor
/usr/bin/nano

Los enlaces duros son menos visibles. Su aplicación más ingeniosa son las copias de seguridad incrementales: cada respaldo diario parece un árbol completo, pero los archivos que no cambiaron son enlaces duros a los del día anterior y no ocupan espacio. Se puede borrar cualquier día sin afectar a los demás, porque los datos sobreviven mientras quede un nombre.

14. ln y sus opciones

La sintaxis de ln es la de cp, y una regla ayuda a no invertir los argumentos: primero lo que existe, después lo que se crea.

anatomía de ln -s
ln -s /usr/share/doc documentacion
   │  │              │
   │  │              └─ el nombre nuevo: el enlace que se crea
   │  └─ el destino: adónde apunta (lo que ya existe)
   └─ simbólico; sin esta opción, el enlace es duro
OpciónEfecto
-sCrea un enlace simbólico.
-rCon -s: calcula la ruta relativa correcta desde el lugar del enlace.
-fSi ya existe algo con el nombre del enlace, lo reemplaza.
-nSi el nombre del enlace es un enlace a un directorio, lo trata como archivo en lugar de entrar en él.
-vMuestra lo que crea.

Tres observaciones. Si se omite el segundo argumento, el enlace se crea en el directorio actual, con el mismo nombre que el destino. ln -s no comprueba que el destino exista: crea sin protestar un enlace a cualquier texto, y por eso hay que verificar. Y para cambiar el destino de un enlace existente, la forma habitual es ln -sfn nuevo-destino enlace.

Queda desarmar el taller, con las comprobaciones de costumbre:

terminal
$ cd ~/practica
$ ls taller taller/sub
taller:
original.txt  sub

taller/sub:
absoluto.txt  blando.txt  relativo.txt
$ rm -r taller
$ ls
fotos  informe.txt  notas.txt  tareas.txt

Y la referencia del tema:

ComandoQué hace
ls -iMuestra el número de inodo.
stat archivoMuestra el contenido del inodo.
ln a bCrea b como enlace duro de a.
ln -s a bCrea b como enlace simbólico hacia a.
readlink enlaceMuestra la ruta que guarda el enlace.
realpath rutaMuestra la ruta final, resueltos todos los enlaces.
find . -type lBusca enlaces simbólicos.
find . -xtype lBusca enlaces simbólicos rotos.
find . -samefile aBusca los demás nombres del mismo archivo.

En el tema 15 cerramos el bloque con la operación inversa a dispersar archivos: reunir muchos en uno solo, y reducir su tamaño, con tar y los compresores.

15. Resumen

16. Preguntas de repaso

Intenta responder cada una antes de abrir la respuesta.

1. ¿Qué información de un archivo no está en su inodo?

El nombre, que se guarda en el directorio, y el contenido, que está en los bloques de datos.

2. ¿Qué contiene un directorio?

Una lista de nombres, cada uno con el número del inodo al que corresponde.

3. ¿Cómo se comprueba que dos nombres son enlaces duros del mismo archivo?

Con ls -li: muestran el mismo número de inodo, y un contador de enlaces mayor que 1.

4. Tras ln a.txt b.txt, ¿cuál es el original y cuál la copia?

Ninguno. Los dos nombres señalan al mismo inodo y son equivalentes; no hay copia ni queda registro de cuál se creó primero.

5. Un archivo tiene dos enlaces duros y se borra uno con rm. ¿Qué pasa con los datos?

Nada. El contador baja a 1 y el contenido sigue accesible por el otro nombre. Solo se liberan cuando el contador llega a cero.

6. ¿Cuáles son las dos limitaciones de los enlaces duros?

No pueden hacerse a directorios y no pueden cruzar de un sistema de archivos a otro.

7. ¿Por qué un directorio sin subdirectorios tiene 2 en la columna de enlaces?

Porque tiene dos nombres: el que figura en su directorio padre, y la entrada . en su propia lista. Cada subdirectorio agrega uno más, por su entrada ...

8. ¿Qué contiene un enlace simbólico?

Una ruta, guardada como texto. Su tamaño es la longitud de esa ruta.

9. ¿En qué se distingue un enlace simbólico en la salida de ls -l?

La línea empieza con l, y después del nombre aparece una flecha con la ruta a la que apunta.

10. ¿Qué ocurre si se borra el archivo al que apunta un enlace simbólico? ¿Y si se borra el enlace?

En el primer caso el enlace queda roto: existe, pero usarlo da «No such file or directory». En el segundo, se borra solo el enlace y el archivo no se ve afectado.

11. Estás en /home/ana y ejecutas ln -s notas.txt docs/acceso. ¿A qué archivo apunta el enlace?

A /home/ana/docs/notas.txt, porque la ruta relativa se resuelve desde el directorio donde está el enlace. Si lo que se quería era /home/ana/notas.txt, el enlace queda roto; debía escribirse ../notas.txt, o usar ln -sr.

12. ¿Cuándo conviene una ruta absoluta en un enlace y cuándo una relativa?

Absoluta, cuando el destino tiene un lugar fijo y el enlace puede moverse. Relativa, cuando el enlace y el destino forman parte de un conjunto que puede moverse o copiarse entero.

13. ¿Cómo se borra un enlace simbólico a un directorio sin tocar el directorio?

Con rm enlace, sin la opción -r y sin barra al final del nombre.

14. Da tres diferencias entre un enlace duro y uno simbólico.

El duro comparte el inodo y el simbólico tiene uno propio; el duro sigue funcionando si se borra el otro nombre y el simbólico queda roto; el simbólico puede apuntar a directorios y a otros discos, y el duro no.

15. ¿Para qué sirve que /usr/bin/python3 sea un enlace a python3.12?

Para ofrecer un nombre estable. Los programas y los usuarios usan python3; cuando se instala una versión nueva, se cambia el destino del enlace y todo sigue funcionando.

Para practicar

  1. Ejecuta ls -li ~/practica y stat ~/practica/notas.txt. Ubica el número de inodo y el contador de enlaces en las dos salidas.
  2. En un directorio de /tmp, crea un archivo con una línea de texto y tres enlaces duros. Verifica el contador. Borra los nombres de a uno, observando el contador cada vez.
  3. Modifica el archivo con nano a través de uno de sus enlaces duros y comprueba el cambio por otro. Algunos editores, al guardar, crean un archivo nuevo y rompen el enlace: mira si los números de inodo siguen coincidiendo.
  4. Crea un enlace simbólico a /etc/hostname en tu directorio de pruebas. Compara ls -l, ls -lL, readlink y realpath sobre él.
  5. Crea un enlace simbólico a un archivo que no existe. ¿Protesta ln? Encuéntralo con find -xtype l, y luego crea el archivo que faltaba y prueba otra vez.
  6. Reproduce la trampa de la sección 10: crea un subdirectorio, y un enlace dentro de él con una ruta relativa incorrecta. Corrígelo de las tres maneras.
  7. Crea un enlace simbólico a /usr/share/doc llamado docs. Entra en él, compara pwd con pwd -P, y observa adónde lleva cd ... Borra el enlace correctamente.
  8. Copia un enlace simbólico con cp y con cp -a, y compara los resultados con ls -l.
  9. Busca con find /etc -maxdepth 1 -type l los enlaces que hay en /etc, y sigue uno hasta su destino final.
  10. Averigua con readlink y realpath a qué programa apuntan realmente /usr/bin/vi y /usr/bin/editor.