juanjonavarro.com

secciones

Sistema de ficheros en Unix

Revisando unos ficheros viejos encontré este pequeño manual sobre los comandos básicos de manipulación de ficheros y directorios en Unix que escribí pero no llegué a publicar. Lo escribí en el año 97, por lo que puede que algo de lo que se habla esté un poco desactualizado (hablo de MSDOS, ¿alguien se acuerda ya?, y de longitud de los nombres de ficheros limitada). Pero en general sigue siendo válido.

Espero que a alguien le sirva.

Sistema de ficheros en Unix.

Directorios y ficheros

El sistema unix se basa, al igual que otros, en una estructura jerárquica de directorios. Aunque es muy probable que el lector esté familiarizado con este esquema, vamos a repasar aquí una serie de conceptos básicos, haciendo hincapié en los aspectos en los que se diferencia del sistema DOS.

Los datos que normalmente maneja el computador se almacenan en forma de paquetes a los que se denominan ficheros. Estos paquetes tienen además de los datos una cabecera en la que se encuentra información especifica del fichero (como por ejemplo el nombre del fichero y la fecha de creación). Estos paquetes se encuentran a su vez organizados dentro de directorios. Esto crea una estructura jerárquica de directorios en forma de árbol que tiene, entre otras, las siguientes características:

  • Existe un solo directorio en lo más alto de la estructura a partir del cual nace todo el resto. A este directorio se le denomina (por la analogía con el árbol) directorio raíz. En Unix se representa con el símbolo / y no con \ como en MS-DOS.
  • Todo directorio tiene un solo directorio padre. Al directorio padre se le denomina siempre .. (dos puntos seguidos). De esta manera con la orden cd .. (que pronto veremos) iremos siempre al directorio padre del actual. Aunque el directorio raíz (/) no tiene padre, se considera que su antecesor el él mismo. De esta manera la anterior orden escrita desde el directorio raíz no produciría un error sino que nos dejaría en la propia raíz.
  • Del mismo modo que existe la entrada .. , existe una entrada llamada . (un solo punto). Representa al propio directorio. De esta manera, la orden cd . no tendría el menor efecto puesto que nos llevaría al propio directorio donde ya nos encontramos. Esta entrada es útil en muchas ocasiones como veremos más adelante.

El sistema de ficheros de Unix se diferencia en muchos aspectos del sistema de ficheros de DOS, como es de suponer debido a las características profundamente diferenciadas de ambos sistemas. Así, debido a que existen varios usuarios diferenciados, Unix es capaz de diferenciar también entre los ficheros de unos y otros, asegurándonos la privacidad de estos.

Ordenes básicas del sistema de ficheros

Cuando empezamos una sesión en Unix, el sistema operativo nos deja automáticamente en un directorio (distinto para cada usuario) al que se denomina directorio home (hogar). Así, el directorio home del usuario antonio será /home/antonio, /users/antonio o algún otro parecido. ¿Cómo podemos saber cual es nuestro directorio home?

Nada más empezar la sesión utilizaremos la orden pwd (print working directory, imprimir el directorio de trabajo) que nos muestra en todo momento en qué directorio nos encontramos. Si el usuario antonio escribiese esta orden obtendría:

/home/antonio

Esta orden no muestra siempre el directorio home, sino que muestra el directorio donde nos encontramos en el momento de teclearla. Naturalmente, al comienzo de la sesión mostrará el directorio home.

Para movernos por la estructura de directorios utilizamos la orden cd (change directory, cambia de directorio). De esta manera si escribimos:

$ cd /

Iremos directamente al directorio / (raíz).

El uso de esta orden sin ningún argumento nos llevará siempre al directorio inicial o home. Para comprobar en todo momento donde nos encontramos, podemos utilizar la orden pwd.

Las entradas .. y . se pueden utilizar con la orden cd para acceder al directorio padre del que nos encontramos y para el propio directorio respectivamente (aunque es este último caso no tiene demasiado sentido). Así:.

$ pwd
/home/antonio
$ cd ..
$ pwd
/home

El espacio entre cd y .. es obligatorio.

Podemos movernos a un directorio que no esté justo por debajo de nosotros si especificamos todos los directorios intermedios que nos separan del objetivo separados por /

$ cd /
$ cd usr/bin
$ pwd
/usr/bin
$ cd ..
$ pwd
/usr
$ cd
$ pwd
/home/antonio
$ cd ../../usr/local/lib
$ pwd
/usr/local/lib
$ cd ../bin
$ pwd
/usr/local/bin
$ cd /usr/doc
$ pwd
/usr/doc

Intenta comprender bien qué hacen estas ordenes antes de seguir adelante.

A parte de movernos por la estructura de directorios de unix, nos interesará también poder manipular esta, crear y borrar ficheros.

Para crear un fichero se utiliza la orden mkdir (make directory, hacer directorio). Esta orden va seguida de una lista de directorios (separados por espacios) que serán creados por el sistema operativo:

$ cd
$ mkdir nuevo

El cd inicial se ha puesto sólo para asegurarnos de que el fichero será creado en el directorio inicial. Para poder comprobar cómo ha sido creado, utilizamos el comando ls. Con él, obtendremos una lista de todos los ficheros contenidos en el directorio.

$ ls
nuevo

Otro ejemplo:

$ mkdir direc1 direc2 direc.ultimo
$ ls
direc.ultimo direc1 direc2 nuevo

Tampoco hay ningún problema en crear directorios que no estén justo debajo del directorio actual. Basta con que le indiquemos al sistema cómo llegar hasta ellos:

$ mkdir nuevo/direc3
$ cd nuevo
$ ls
nuevo

Para borrar directorios utilizamos la orden complementaria a crear un directorio: rmdir (remove directory, borrar directorio). Su sintaxis es igual a la de mkdir. Al nombre del comando le sigue una lista de directorios a borrar:

$ rmdir direc1 direc2

La anterior orden borraría los directorios direc1 y direc2.

Para poder borrar un directorio este debe estar vacío.

Evidentemente, los directorios no nos servirían para nada si no pudiesemos guardar ficheros en su interior. Lo primero que debemos saber es cómo crear un fichero. Utilizamos la orden:

$ cat > nombre.fichero

Todo lo que escribamos a partir de ese momento será incluido dentro del fichero nombre.fichero. Para indicarle al ordenador que queremos terminar la creación del fichero utilizamos ^D (control+d). Aunque es evidente que este no será el metodo principal de creación de ficheros (ya que los ficheros serán creados por los programas que utilicemos en nuestro trabajo cotidiano, como procesadores de textos, programas de contabilidad, diseño asistido por computador, etc…) utilizaremos este método por resultar sencillo para crear ficheros con los que poder practicar las siguientes ordenes.

Nombres de los ficheros

Los nombre de los ficheros en unix merecen una atención especial. En general, el nombre de los ficheros en un sistema operativo depende de las elecciones de diseño que se hicieron en sus sistema de ficheros en el momento de su creación. Así, debido a un intento de simplificar el diseño del sistema de archivos de MS-DOS, se imponen las restricciones de 8 caracteres como máximo en el nombre y 3 en la extensión.

Unix no es sólo un sistema operativo. En la larga historia de éste han aparecido multitud de versiones algunas de las cuales han reescrito el sistema de ficheros. De esta manera existen en la actualidad varios estándares que afectan al tipo de nombres que es posible dar al los ficheros. Todos ellos comparten las siguientes características:

  • No existen diferencias en el nombre que es posible darle a los ficheros y a los directorios.
  • No se diferencia entre nombre de ficheros y extensión. Aunque el . (punto) puede ser utilizado dentro del nombre del fichero, no es más que otro carácter más, no teniendo asignado ningún significado especial (como ocurre en MS-DOS, donde sirve como separador entre nombre y extensión). De esta manera, puede haber un punto, ninguno e incluso varios dentro del nombre.
  • Existen algunos caracteres que deben ser evitados dentro del nombre, como son /,-, >,<. En general se deben evitar todos aquellos caracteres de los cuales hace uso el shell.

Las diferencias entre sistemas de ficheros distintos están principalmente referidas a la longitud que se le puede dar a los nombres. En Linux (y en muchos otros unix), se admiten longitudes de hasta 256 caracteres. Esto proporciona suficiente espacio para escribir un nombre realmente descriptivo del contenido del fichero. Desgraciadamente, existen todavía s.o. que utilizan un sistema de ficheros que limita la longitud de los ficheros a 14 caracteres. Recuérdese que el punto cuenta como un carácter más.

Una vez visto como podemos crear un fichero de una manera básica, veamos las ordenes que tenemos para su manipulación. En primer lugar tenemos la orden cp (copy, copiar) que nos permite crear una copia exacta de un fichero en el mismo directorio o en otro aparte. Su sintaxis es:

cp [lista de ficheros] [fichero o directorio de destino]

Si la lista de ficheros inicial consta de un solo fichero y se trata de un fichero de destino (en lugar de un directorio), lo que estaremos haciendo es crear un nuevo fichero, como en:

cp prueba fichero.de.destino

Que crea un nuevo fichero con el nombre fichero.de.destino copia exacta de prueba.

Por el contrario si en lugar de un fichero de destino escribimos el nombre de un directorio, Unix lo copiará dentro de él, conservando el mismo nombre.

Por último, si especificamos una lista de más de un fichero, estaremos obligados a indicar un directorio donde copiarlos, en lugar de un fichero. Así:

cp prueba un.fichero direc2

Copiará los ficheros prueba y un.fichero dentro del directorio direc2. Si no existiese ningún directorio con ese nombre, el comando dará un error, no creará un fichero direc2.

A la orden cp se le pueden especificar los siguientes modificadores:

-i Interactivo. Pregunta si queremos sobreescribir el fichero de destino cuando este existe. Así:

cp -i prueba fichero.de.destino Preguntará si queremos sobreescribir fichero.de.destino en el caso de que este ya exista. -r Recursivo. Crea copia de todos los subdirectorios también. Esto quiere decir que si el o los directorios especificados tuviesen a su vez otros directorios en su interior estos serian copiados del mismo modo. Esta última forma es muy potente, ya que nos permite crear copia de toda una rama del sistema de ficheros.

Existe también un comando en Unix para cambiar el nombre y/o mover un fichero. Se trata de mv (move, mueve). Su sintaxis es muy parecida a la de la orden cp:

mv [fichero o ficheros a renombrar/mover] [nuevo nombre o lugar]

Si se utiliza un solo nombre como fichero a mover o renombrar, su efecto dependerá de lo que hayamos elegido como nuevo nombre:

  1. Si se trata de un directorio, el efecto será el de mover el fichero indicado dentro de ese directorio.
  2. Si no se trata de un directorio, se considerará que ese es el nombre que deseamos para el fichero indicado, y el ordenador le cambiará el nombre.
  3. También se puede dar una mezcla de ambos casos. En el siguiente ejemplo:
mv fichero /direc/nuevo El efecto será el de mover el fichero al directorio direc cambiándole el nombre por nuevo (suponiendo que direc sea un directorio y nuevo no lo sea, claro)

Si utilizamos una lista de más de un fichero como parámetros iniciales, necesariamente deberemos proporcionar el nombre de un directorio como parámetro final al cual serán movidos todos los ficheros. No hay ningún problema en especificar entre los ficheros a mover el nombre de algún directorio, ya que mv es capaz de mover y renombrar directorios. Con el comando mv podemos utilizar el modificador -i que tiene, como en el caso de cp, el efecto de pedir confirmación cuando tratamos de sobreescribir algún fichero ya existente.

Si lo que pretendemos es borrar un fichero debemos utilizar el comando rm. Recibe como parámetros la lista de ficheros que queremos borrar. Algunos de sus modificadores:

-i Interactivo. Pide confirmación antes de borrar cada fichero.
-r Recursivo. Si se especifica este modificador, se podrá indicar como fichero a borrar el nombre de un directorio. Su efecto será borrar el contenido completo de este directorio (incluidos subdirectorios) y finalmente borrar el propio directorio. Esto nos sirve para eliminar con una sola orden toda una rama del sistema de ficheros.

Hasta ahora hemos utilizado la orden ls de modo sencillo para ver qué ficheros tenemos en un directorio. No obstante, la orden ls es mucho más rica, de hecho tiene una gran cantidad de modificadores, de los cuales ahora sólo nos ocuparemos de los más utilizados. Si le indicamos una lista de ficheros, sólo nos mostrará información sobre esos ficheros.

-l Nos muestra el directorio en formato largo (long). Así se nos da información sobre el tipo de fichero, sus permisos (que veremos en la siguiente sección), sus poseedores, su longitud y fecha de creación.
-a Nos muestra todos los ficheros. Por defecto ls no muestra los ficheros que comienzan por . (punto)
-F Muestra después del nombre de cada fichero un carácter indicando el tipo de este. Muestra, por ejemplo, / para los directorio y * para los ejecutables.
-d Muestra los datos de los directorios como si fuesen ficheros normales. Por defecto ls nos muestra información sobre el contenido de los directorios y no sobre el propio directorio.
-r Muestra los ficheros en orden inverso.
-R Lista el contenido de los directorios recursivamente. Eso quiere decir que mostrará todos los ficheros contenidos dentro de los directorios, incluidos los ficheros contenidos dentro de los sub-directorios situados dentro del directorio y así ad nauseam
-1 Fuerza a que en la salida se escriba un solo fichero por linea.
-C Fuerza a que la salida se produzca en columnas. Este es el formato por defecto.

Permisos en los ficheros

Pasaremos ahora a ocuparnos de los permisos de cada fichero. Como ya vimos en la sección anterior, el comando ls muestra es su formato largo información sobre los ficheros, entre la cual se encuentran los permisos así como los poseedores de cada fichero.

Unix divide a los usuarios (en los que respecta a ficheros) en tres grupos:

  1. El poseedor (owner).
  2. El grupo poseedor.
  3. El resto de usuarios.

Así, el poseedor y el grupo nos los muestra al escribir ls -s. Por ejemplo:

$ ls -l
-rw-r—r— 6 antonio users 745 Feb 8 20:36 prueba

En este caso nos muestra información sobre el fichero prueba. El dueño de este fichero es antonio, mientras que el grupo al cual pertenece es users. Pero qué son los primeros 10 caracteres de la línea? El primero de ellos indica el tipo de fichero de qué se trata. En esta posición aparecerá una “d” cuando se trate de un directorio mientras que quedará en blanco (un guión) cuando sea un fichero normal. Los siguientes 9 caracteres indican los permisos de ese fichero y deben ser divididos en grupos de tres. Los primeros tres caracteres indican los permisos que el dueño del fichero tiene sobre él:

  • r
Permiso de lectura. Para poder copiar un fichero hemos de ser capaces de leerlo.
  • w
Permiso de escritura. El cual incluye tan solo el permiso de modificación del fichero. Es muy importante tener en cuenta que este modificador no nos da permiso para borrar el fichero, sino solo para modificar su contenido. El permiso para borrar un fichero viene determinado por los permisos del directorio donde se encuentra (ver más adelante).
  • x
Permiso de ejecución. Nos indica si el fichero contiene un programa ejecutable por el sistema operativo.

A continuación vienen otros tres caracteres indicando los mismos permisos para el grupo al cual pertenece el fichero y finalmente tres caracteres indicando los permisos del resto de usuarios.

Los permisos de un directorio deben ser entendidos de modo algo distinto a los anteriores. Para un directorio, entendemos cada uno de los permisos de la siguiente manera:

  • r
Lectura de directorio. Indica si podemos ver el contenido del directorio (mediante la orden ls, por ejemplo).
  • w
Permiso de escritura. Indica si podemos crear nuevos ficheros dentro del directorio así como borrar los ya existentes.
  • x
Permiso de paso. Nos indica si podemos entrar dentro del directorio mediante la orden cd.

Para cambiar estos permisos utilizamos la orden chmod (change mode). Su sintaxis es la siguiente:

chmod [ugoa] [+-=] [rwx] [lista de ficheros]

El primer parámetro es una combinación de las letras “u”, “g”, “o”, “a” e indica si los permisos se van a cambiar para el dueño del fichero (u), para el grupo (g), para el resto (o) o para todos a la vez (a).

El segundo parámetro indica si el modificador se va a activar (+), desactivar(-) o dejar como el único activo(=).

Finalmente se indica “r”, “w”, o “x” según queramos cambiar los permisos de lectura, escritura o ejecución.

Algunos ejemplos:

  • chmod a+w direc

Activa el permiso de escritura para todos los usuarios (dueño, grupo y el resto)

  • chmod o=r nuevo

Activa el permiso de lectura para el resto de usuarios eliminando todos los demás permisos.

  • chmod o-r+w nuevo

Quita al resto de usuarios el permiso de lectura del fichero y activa el permiso de escritura.

  • chmod ug-w direc

Quita el permiso de escritura sobre el fichero al dueño y al grupo poseedor.

  • chmod a+rwx direc

Activa todos los permisos para todos los usuarios.

Enlaces y enlaces simbólicos

Una última particularidad del sistema de ficheros Unix son los enlaces. Supongamos que existe un grupo de usuarios (por ejemplo antonio y luis) que están trabajando en un proyecto común. Puede que este grupo utilice una serie de ficheros (por ejemplo el fichero texto.doc) como referencia conjunta, en la que cada uno de ellos escribe el estado actual de la parte del proyecto que a él le corresponde. Se podría dejar este fichero en un directorio al cual ambos pudiesen acceder, pero sería mucho más cómodo si se pudiese situar dentro del directorio home de cada uno de ellos. Para eso es para lo que nos pueden servir los enlaces (links). Un enlace es otro nombre para el mismo fichero (lo cual puede incluir otra localización). Por ejemplo si tenemos el fichero /home/antonio/texto.doc, podemos utilizar la orden:

ln /home/antonio/texto.doc /home/luis/texto.txt

Con esto aparecerá un fichero en el directorio /home/luis, llamado texto.txt que es en realidad el fichero texto.doc. Cualquier cambio sobre cualquiera de ellos se podrá ver desde el otro ya que realmente se trata del mismo fichero.

La cuenta de cuantos enlaces existen de un fichero nos la da el sistema operativo cuando utilizamos la orden “ls -l” (es el número que aparece justo después de los permisos de los ficheros). Cuando borramos un fichero, este no desaparece mientras aún exista algún enlace que apunte hacia él.

El problema de los enlaces es que sólo podemos crear un enlace de un fichero, no de un directorio. Del mismo modo, sólo se puede crear un enlace a un fichero que exista dentro del mismo sistema de archivos donde nos encontramos. Si, por ejemplo, tenemos dos discos duros, nos podría resultar interesante enlazar uno de los fichero en el primer disco duro con un fichero en el segundo disco duro.

Para poder realizar estos últimos tipos de enlaces se crearon los enlaces simbólicos (symlinks). Para utilizarlos se añade el modificador -s a la orden ln:

ln -s /home/antonio /home/luis/antonio

Con esto aparecería dentro de /home/luis un directorio llamado antonio y que sería en realidad un enlace al directorio /home/antonio. Por desgracia, los enlaces simbólicos no son tan transparentes al usuario como los enlaces normales, de tal forma que aunque podemos utilizar el nuevo directorio de modo igual al original, es muy importante no borrar el directorio original. Aunque el enlace /home/luis/antonio seguirá existiendo, cualquier intento de acceder a él producirá un error ya que los datos a los cuales enlaza habrán sido borrados.

El modificador -i puede ser utilizado con la orden ln. Como ya vimos, el efecto es el de pedir confirmación antes de sobreescribir un fichero.

Comentarios cerrados para este artículo