.. include:: ../../my-header_2.txt

¿Cuántos nombres tiene un fichero?
--------------------------------

Asumimos que el nombre (absoluto) de un fichero identifica unívocamente el fichero. Esto ha de ser así para evitar ambigüedades. Pero, ¿puede tener un fichero más de un nombre? Ya sabemos que el *shell* nos permite referirnos a un fichero de varias formas jugando con la ruta (por ejemplo ``fichero`` y ``./fichero``), pero este es un mecanismo puramente sintáctico. ¿Podemos tener un fichero con dos nombres *absolutos* diferentes?

A diferencia de otros sistemas, en Linux el nombre no es *el* identificador de un fichero, sino *un* identificador del fichero. El verdadero identificador de un fichero Linux es un número entero que identifica unívocamente una estructura llamada *i-node*. No vamos a entrar en el detalle de qué es un *i-node*, solo vamos a subrayar que en un sistema Linux existe una biyección entre *i-nodes* y ficheros. Crear un fichero implica crear un *i-node*, y eliminar un fichero implica eliminar el *i-node*. 

.. note:: 

   El sistema de ficheros no es central a los objetivos del curso. Bastará saber que el *i-node* es la estructura que identifica unívocamente a un fichero y que contiene la información de atributos del fichero (esa que obtenemos con ``ls -l``) y los apuntadores a los bloques donde se almacena el contenido del fichero en el dispositivo soporte (disco, memoria *flash*…).

Ahora ya podemos precisar qué es un directorio Linux: una lista de pares (*nombre-de-fichero*, *número-de-i-node*). Cuando se crea un fichero hay que asociarle forzosamente un nombre, por lo tanto se crea una entrada nueva en el directorio con el *i-node* y el nombre relativo, que debe ser único en ese directorio. 

Con los conceptos anteriores, estás en condiciones de describir qué significa ``cp a b`` y qué significa ``mv a b`` en términos de qué ocurre con el directorio y los *i-nodes*. 

¿Qué hace la orden ``ln a b``? Para explicarlo hay que entrar en un detalle del *i-node*. Un *i-node* contiene un campo *cuenta-de-referencias*. Cuando se crea un *i-node*, su *cuenta-de-referencias* se pone a 1. Así, cuando se creó ``a`` se le asoció un *i-nodo* ``i`` y se añadió en el directorio la entrada (``a``, ``i``). Lo que hace la orden ``ln a b`` es incrementar la *cuenta-de-referencias* de ``i`` e incluir una nueva entrada en el directorio (``b``, ``i``). 

Esta forma de dar un nuevo nombre a un fichero en los sistemas UNIX-Linux es muy diferente del concepto de *acceso directo al fichero* de muchos sistemas operativos. Puedes comprobarlo si después de hacer ``ln a b``, haces ``rm a``, es decir, eliminas el fichero "original". En la jerga UNIX estos enlaces que se establecen con ``ln`` se denominan *enlaces hardware*.

En realidad también en Linux podemos establecer accesos directos. Para ello se utiliza ``ln -s``. Estos enlaces se denominan *enlaces software* o *simbólicos*. Un enlace simbólico no es más que un fichero que contiene el nombre absoluto del fichero enlazado (el "original"). Los enlaces simbólicos son obligatorios para enlazar directorios (de hecho, no hay que poner siquiera la opción ``-s``). ¿Por qué? Imagina que no fuese así y que hacemos ``ln .. b`` (es decir, damos un nombre ``b`` al directorio padre en el directorio actual), y a continuación ejecutamos ``ls -R ..`` (recuerda que con esta orden se recorren recursivamente todos los subdirectorios). Si ``ln`` estableciera un enlace hardware, ``ls -R`` no acabaría nunca. 

.. include:: ../../my-footer_2.txt
