Manipulación de archivos
Introducción
Tras leer este capítulo, el lector estará capacitado para moverse por el árbol de Linux y para crear, mover y borrar archivos y directorios.
Nombres de archivos y de directorios
Los nombres de archivos y de directorios en Linux responden a ciertas reglas de escritura.
Descripción del contenido
En primer lugar, un nombre de archivo debe proporcionar indicaciones sobre su contenido; esto es válido para todos los sistemas operativos.
Para un profesor, es más fácil encontrar las notas de historia de la clase de 6º A del primer trimestre de 2022 en el archivo llamado notas.historia.clase.6A.trim.1.2022 que en el archivo llamado vale.
Sintaxis
La distinción de mayúsculas y minúsculas es determinante en la sintaxis de los nombres de archivos. Así, los archivos vale, Vale y VALE son distintos.
Sólo deben utilizarse los caracteres alfanuméricos (de a a z, A a Z y 0 a 9) junto con algunos más (_, ., @, -, +) en los nombres de archivos.
Algunos caracteres tienen un significado especial en la línea de comandos; estos se detallarán en el capítulo dedicado al Shell Bash. Por ejemplo, borrar a* no significa borrar el archivo llamado a*, sino todos los archivos que empiezan por la letra a.
De hecho, pueden utilizarse todos los caracteres en los nombres de archivo exceptuando /, que es el carácter de separación de nombres de directorios en la línea de comandos.
Los signos - y + deben evitarse al principio de un nombre de archivo porque puede haber ambigüedad con algunas opciones de la línea...
Tipos de archivos
En Unix se entiende por archivo la estructura que contiene datos del usuario.
Los archivos estándar están constituidos por una serie de caracteres o flujo de bytes cuyo formato no viene impuesto por el sistema, sino por las aplicaciones.
La analogía entre byte y carácter se debe al hecho de que un carácter se codifica con un byte; el tamaño de un archivo puede indicarse, por tanto, tanto en bytes como en caracteres.
Los directorios son archivos especiales que pueden contener otros muchos archivos (directorios o no). Esto permite organizar los archivos de forma jerárquica en estructura de árbol.
Los términos "directorio" y "archivo", utilizados en Linux, son equivalentes a "carpeta" y "documento" empleados habitualmente en Windows y Mac OS.
Existen siete tipos de archivos en Linux; los tres más importantes son:
-
archivo estándar u ordinario;
-
directorio;
-
vínculo simbólico o lógico (soft link).
Los otros cuatro tipos de archivo, que se trabajan principalmente en la administración o en programación del sistema, son:
-
archivo que apunta a un dispositivo de tipo "bloque" (archivos presentes /dev);
-
archivo que apunta a un dispositivo de tipo "carácter" (archivos presentes en /dev);
-
archivo de tubería llamado "named pipe" para la comunicación entre procesos;
-
archivo...
Rutas
Conocer el nombre de un archivo (o de un directorio) no es suficiente para acceder a él; un mismo nombre puede estar asociado a varios archivos en directorios diferentes.
La referencia plenamente cualificada de un archivo se denomina "ruta" e indica el directorio en el que se encuentra el archivo. Los nombres de directorios y de archivos van separados por una / (barra oblicua) en las rutas.
Atención, en un sistema Windows, el separador entre los nombres de archivo y de directorios es el \ (barra inversa).
Existen tres tipos de rutas: absolutas, relativas y personales. Pueden utilizarse indiferentemente en la forma de nombrar archivos en la línea de comando.
Ejemplo de árbol:
1. Rutas absolutas
Una ruta absoluta se basa en la raíz del árbol de Linux. Toda ruta absoluta empieza, pues, por /.
Sea cual sea la ubicación actual donde se encuentre, se podrá referenciar el archivo notas del ejemplo anterior con la ruta /home/willy/notas.
Ejemplo:
[willy]$ ls /home/willy/notas
/home/willy/notas
2. Rutas relativas
Las rutas relativas dependen del directorio actual en el que se encuentra el usuario.
Sabiendo que cada directorio en el sistema contiene los archivos . (punto) y .. (punto-punto) que referencian respectivamente el propio directorio actual y el directorio padre, existen varias rutas relativas que designan el archivo notas en el ejemplo:
Directorio actual |
Ruta relativa correspondiente |
/home |
willy/notas... |
Exploración del árbol
1. pwd
El comando pwd (print working directory) muestra la ruta absoluta del directorio actual en el que se encuentra el usuario:
[willy]$ pwd
/home/willy
2. cd
El comando cd (change directory) permite cambiar de directorio actual. En la línea de comandos, se indica como argumento junto con el directorio al que se quiere ir:
[willy]$ pwd
/home/willy
[willy]$ cd /var/spool
[willy]$ pwd
/var/spool
[willy]$ cd ..
[willy]$ pwd
/var
En este ejemplo el comando que permite "subir" hacia el directorio padre cd .. y no cd.. (sin espacio) como en DOS: el carácter de espacio es obligatorio entre el comando y su argumento.
Además, la ruta del archivo (o del directorio) como argumento puede ser absoluta, relativa o personal; esto es válido para todos los comandos.
Llamado sin argumentos, el comando cd devuelve al usuario a su directorio personal:
[willy]$ pwd
/var
[willy]$ whoami
willy
[willy]$ cd
[willy]$ pwd
/home/willy
Finalmente, la sintaxis particular siguiente permite volver al directorio anterior:
[willy]$ pwd
/home/willy
[willy]$ cd -
/var
[willy]$ pwd
/var
No hay que confundir el directorio "padre" (..), situado sobre el directorio actual en el árbol de Linux, con el directorio "anterior", que corresponde al directorio en el que se encontraba antes el usuario.
3. ls
El comando ls permite listar el contenido de directorios. Sin opciones, la visualización sigue el orden alfabético de los nombres de archivo.
Argumentos
Llamado sin argumentos, ls se limita a mostrar los archivos presentes en el directorio actual:
[willy]$ cd
[willy]$ pwd
/home/willy
[willy]$ ls
colores formas notas
Puede especificarse una o más rutas en la línea de comandos. Si la ruta corresponde a un directorio, se muestran los archivos que contiene; si es un archivo, se muestra su nombre:
[willy]$ pwd
/home/willy
[willy]$ ls notas . colores /home/gerardo ~nicolas/novale
ls: /home/nicolas/novale: No such file or directory
notas
.:
colores formas notas
colores:
azul amarillo rojo
/home/gerardo:
archivo1
Cuando la ruta no corresponde a ningún archivo o directorio, el comando devuelve un error.
Opción -l
La opción...
Directorios
1. mkdir
El comando mkdir (make directory) permite crear directorios:
[willy]$ ls -l
total 12
drwxr-xr-x 2 willy tec 4096 jun 1 10:42 colores
drwxr-xr-x 2 willy tec 4096 jun 1 10:43 formas
-rw-r--r-- 1 willy tec 62 may 26 22:55 notas
[willy]$ mkdir flores
[willy]$ ls -l
total 16
drwxr-xr-x 2 willy tec 4096 jun 1 10:42 colores
drwxr-xr-x 2 willy tec 4096 jun 1 11:30 flores
drwxr-xr-x 2 willy tec 4096 jun 1 10:43 formas
-rw-r--r-- 1 willy tec 62 may 26 22:55 notas
Se pueden indicar varios argumentos en la línea de comandos:
[willy]$ ls
colores flores formas notas
[willy]$ mkdir nombres flores/alegres
[willy]$ ls . flores
.:
colores flores formas nombres notas
flores:
alegres
Hay que agregar la opción -p (padres) para crear una serie de directorios anidados:
[willy]$ mkdir -p estaciones/invierno/enero
[willy]$ ls -R
.:
colores flores formas nombres notas estaciones
./colores:
azul amarillo rojo
./flores:
alegres
./flores/alegres:
./formas:
círculo triángulo
./nombres:
./estaciones:
invierno
./estaciones/invierno:
enero
./estaciones/invierno/enero:...
Archivos
1. touch
El comando touch cambia las fechas del último acceso y de la última modificación de un archivo existente:
[willy]$ ls -l notas
-rw-r--r-- 1 willy tec 62 may 26 22:55 notas
[willy]$ touch notas
[willy]$ ls -l notas
-rw-r--r-- 1 willy tec 62 jun 1 11:37 notas
Diversas opciones, detalladas en la página del manual electrónico (véase capítulo Documentación, apartado Manual), permiten precisar el nuevo fechado del archivo.
Cuando se emplea este comando con un nombre de archivo inexistente como argumento, se crea un archivo con ese nombre que no contiene ningún dato:
[willy]$ ls -l
total 12
drwxr-xr-x 2 willy tec 4096 jun 1 10:42 colores
drwxr-xr-x 2 willy tec 4096 jun 1 10:43 formas
-rw-r--r-- 1 willy tec 62 jun 1 11:37 notas
[willy]$ touch nuevoarch
[willy]$ ls -l
total 12
drwxr-xr-x 2 willy tec 4096 jun 1 10:42 colores
drwxr-xr-x 2 willy tec 4096 jun 1 10:43 formas
-rw-r--r-- 1 willy tec 62 jun 1 11:37 notas
-rw-r--r-- 1 willy tec 0 jun 1 11:38 nuevoarch
2. cp
La copia de archivos se efectúa con el programa cp; la sintaxis principal de este comando es:
cp [-R] <origen ...> <destino>
Se puede copiar un archivo normal en un nuevo directorio o con un nuevo nombre, o ambas cosas a la vez; por ejemplo:
[willy]$ ls -R
.:
colores formas notas nuevoarch
./colores:
azul amarillo rojo
./formas:
círculo triángulo
[willy]$ cp notas minota
[willy]$ cp colores/amarillo formas
[willy]$ cp formas/triángulo curva
[willy]$ ls -R
.:
colores curva formas rombo notas nuevoarch
./colores:
azul amarillo...
Organización física de los archivos en Linux
Aunque esta etapa parezca precipitada para una aproximación de tipo "usuario" a Linux, el aprendizaje de la organización física de los sistemas de archivos es primordial. Permite una correcta comprensión de la noción de enlaces y una buena gestión de los derechos de acceso.
Un sistema de archivos físico puede separarse en dos partes distintas:
-
la tabla de inodos;
-
los bloques de datos.
Todo archivo está constituido por un inodo con la información relativa al archivo y un cierto número de bloques de datos con los datos del usuario almacenados en el archivo.
1. Inodos
Cada archivo se representa por una estructura llamada inodo (índex node). Estos inodos se agrupan en una tabla y se identifican por un número.
El inodo contiene toda la información sobre el archivo, salvo su nombre:
-
Tipo de archivo: - (normal), d (directorio), l (enlace simbólico), b (bloque), c (carácter), p (tubo), s (socket).
-
Modo o derechos de acceso al archivo.
-
Número de enlaces físicos (hard links): corresponde al número de referencias, es decir, al número de nombres para este mismo archivo.
-
UID o identificador del usuario propietario.
-
GID o identificador del grupo propietario.
-
Tamaño del archivo en número de bytes.
-
Fechas de la última consulta, modificación del contenido y modificación...
Administradores de archivos
Existen en Linux muchas herramientas que agrupan de forma más o menos ergonómica y amigable todas las funcionalidades implementadas por los comandos enunciados hasta ahora.
1. Midnight Commander
Midnight Commander se llama con el comando mc en la línea de comandos. Es un administrador de archivos completo en un entorno de texto con una interfaz de usuario de un producto similar existente en DOS.
Veamos un ejemplo de presentación:
La tecla [Tab] permite pasar de una mitad de la pantalla a la otra (izquierda-derecha), mientras que las teclas de función [F1] a [F10] invocan los comandos indicados en la parte inferior de la pantalla.
2. Dolphin, Nautilus
En la consola gráfica, los administradores de archivos más extendidos son Dolphin (antiguo Konqueror) y Nautilus.
La elección de la herramienta es subjetiva y depende generalmente de la distribución y el entorno de escritorio utilizados.
Una ventana de Dolphin:
Una vista posible de Nautilus:
Consultar archivos
1. cat
cat muestra en la pantalla el contenido de los archivos pasados como argumento en la línea de comandos:
[nicolas]$ cat /etc/motd
Bienvenido a Linux
Está conectado al equipo doe.reso.local
2. more, less
El comando Unix more también permite la presentación del contenido de archivos de texto en pantalla. Sin embargo, su visualización se hace página por página; las teclas útiles con more son:
[Intro] |
Desplaza el texto línea a línea. |
[Espacio] |
Desplaza el texto página por página. |
[q] |
Sale del programa. |
Este ejemplo muestra el indicador presente en la parte inferior de la pantalla:
[nicolas]$ more /etc/services
ssh 22/udp # SSH Remote Login Protocol
telnet 23/tcp
telnet 23/udp # 24 - private mail system
smtp 25/tcp mail
smtp 25/udp mail
time 37/tcp timserver ...
Ejercicios
Ejercicio 1
Descargue de Internet la imagen que quiera y muévala a un subdirectorio de /tmp que tenga su nombre.
Solución
Utilice un navegador web para descargar una imagen y grábela en la carpeta propuesta por defecto:
Podemos constatar que el archivo ha sido grabado en un subdirectorio Descargas de la carpeta personal del usuario.
Una vez creado el directorio de destino como exige el enunciado, bastará con emplear el comando mv adecuado para desplazar el archivo:
[javier]$ cd
[javier]$ pwd
/home/ javier
[javier]$ ls Descargas
indice.jpg
[javier]$ mkdir /tmp/ javier
[javier]$ mv Descargas/indice.jpg /tmp/ javier
[javier]$ ls Descargas
[javier]$ ls /tmp/ javier
indice.jpg
Ejercicio 2
Elimine el archivo y los subdirectorios creados en el ejercicio anterior.
Solución
No se puede eliminar directamente el subdirectorio creado en /tmp con el comando rmdir porque este no está vacio.
Por contrario, el comando rm con la opción -R ("recursivo") permite eliminarlo al igual que todos los archivos que contenga:
javier@Debian8:~$ rmdir /tmp/javier
rmdir: fallo al borrar "/tmp/javier": El directorio no está vacío
javier@Debian8:~$ rm -R /tmp/javier
javier@Debian8:~$ ls /tmp/javier
ls: no se puede acceder a /tmp/javier: No existe el fichero o el directorio
javier@Debian8:~$