5. Directorios y archivos en UNIX: Parte 1¶
5.1. Arquitectura UNIX¶
Un directorio es una carpeta. Los sistemas operativos en general se organizan en directorios, subdirectorios y archivos. Entonces los directorios también son ubicaciones dentro de la memoria del computador, como ubicaciones en un mapa. Un archivo o fichero es un conjunto de información digital (bytes guardados en memoria) en algún formato como texto plano, PNG, markdown y miles de otros formatos.
UNIX se organiza por un sistema de archivos en estructura de árbol invertido. Todo en Linux y sistemas UNIX es un archivo o un directorio. Esta jerarquía comienza con el directorio raíz (root diectory), indicado por /
. Este directorio contine subdirectorios y archivos importantes con sotfware esencial para el funcionamiento del sistema operativo y software instalado o creado por el usuario. Para información detallada visita http://www.linfo.org/filesystem.html o también http://www.linfo.org/index.html. Un resumen rápido de los subdirectorios en /
es:
Directorio |
Funcnión de archivos y subdirectorios |
---|---|
|
Ejecutables para funcionamiento mínimo esencial del sistema operativo como arrancar, reparar, las shell como |
|
Ejecutables necesarios para arrancar el sistema operativo. |
|
Dispositivos hardware y controladores. |
|
Configuración adicional de sistema. |
|
Datos de usuario. |
|
Librerías y módulos de kernel. |
|
Puntos de montaje para dispositivos removibles. |
|
Puntos de montaje para sistemas de archivos temporales (particiones). |
|
Paquetes opcionales de software. |
|
Ejecutables para administración del sistema operativo disponibles para el usuario principal del computador o |
|
Datos para servicios del sistema, como data de servidores HTTP, entre otros. |
|
Archivos temporales. Los archivos se borran cuando el sistema reinicia. |
|
Jerarquía secundaria. Actúa como root |
|
Datos variables, especialmente archivos generados en tiempo de ejecución. Esta información no se borra de manera automática. |
Para acceder a un directorio se usa el comando cd
. El argumento de este comando es un directorio
. Miremos un ejemplo. Ejecuta los comandos:
$ cd /
$ ls
Hay varios otros directorios importantes como se podrá ver. Estos deberán ser revisados por tu cuenta. Vamos a acceder al directorio /
y vamos a mostrar su contenido. En el sistema operativo Linux se puede ver de esta manera:
En el sistema operativo MacOS varía un poco, debido a que Apple ha aplicado algunas adaptaciones para su sistema operativo, sin embargo, conserva los directorios esenciales como /bin
, /sbin
y /usr
. Se puede ver de esta manera:
5.2. Algunos comandos para operar con directorios y archivos¶
Comando |
Función |
---|---|
|
Imprime el directorio de trabajo actual. |
|
Dirigirse 1 directorio atrás. |
|
Dirigirse 2 directorios atrás. |
|
Limpia la terminal |
|
Crear un directorio |
|
Crear un archivo |
|
Remover un archivo. No se puede usar para elminiar directorios. |
|
Remover recursivamente. Se usa para remover directorios y subdirectorios. |
|
Remover recursivamente de manera forzada. Se usa para evitar que el sistema evite elminiar un directorio. |
|
Mover un archivo a un directorio. |
|
Copiar un archivo a un directorio. |
5.3. Directorio de inicio / Home directory¶
$ cd ~
El directorio de inicio o home, nombrado por el caracter tilde ~
. Al abrir Terminal este automáticamente se dirige a ~
. Contiene todos los directorios con contenido creado por el usuario y software específico. Algunos directorios son ~/Desktop
para el escritorio, ~/Documents
para los documentos, etc.
5.4. Ejercicio: Crear y elminiar directorios. Crear, mover y elminiar archivos.¶
Vamos a crear directorios, subdirectorios y un archivo de texto. Luego veremos el resultado. Después borraremos el directorio de manera recursiva.
Tip
Notemos que cuando queremos nombrar un archivo o un directorio con dos palabras, en lugar de usar un espacio entre ellos usamos un guión bajo, porque así nos evitamos problemas para acceder a estos directorios desde Terminal. Procura dar nombres que no tengan espacios en blanco a los archivos y carpetas.
Por ejemplo: asi no.png
, asi_si.png
.
$ cd ~/taller_unix/3_manejo_terminal
$ mkdir prueba
$ cd prueba
$ mkdir directorio_publico
$ mkdir .directorio_secreto
$ touch README.txt
$ ls
Como se puede ver en la captura de pantalla de Terminal, el directorio ~/taller_unix/3_manejo_terminal/prueba
que se creó contiene un directorio escondido ~/taller_unix/3_manejo_terminal/prueba/.directorio_secreto
, un directorio público ~/taller_unix/3_manejo_terminal/prueba/.directorio_secreto
y un archivo de texto ~/taller_unix/3_manejo_terminal/prueba/README.txt
. Cuando usamos el comando ls
dentro del directorio ~/taller_unix/3_manejo_terminal/prueba/
, vemos todo menos el directorio secreto. Para revelarlo usamos la opción -a
.
$ ls -a
Además podemos revelar el directorio completo hacia la carpeta ~/prueba
con el comando pwd
, que significa print working directory. Como se ve en la imagen abajo, el directorio completo es /Users/j/taller_unix/3_manejo_terminal/prueba
y no ~/taller_unix/3_manejo_terminal/prueba
. Primero hay que notar que son el mismo directorio. Segundo, esto ocurre porque el caracter ~
es un alias al directorio /Users/j/
, entonces significa lo mismo que ~
. Los alias son útiles para acortar directorios o comandos.
$ pwd
En esta imagen, el comando ls -a
revela, además del directorio escondido, dos nuevos directorios extra muy importantes: ./
y ../
. Estos directorios significan directorio actual y directorio anterior, respectivamente. Sirven para poder operar dentro del directorio actual o para salir del directorio actual, respectivamente. Salgamos del directorio hacia ~/taller_unix/3_manejo_terminal
y creemos un archivo que vamos a mover hacia ~/taller_unix/3_manejo_terminal/prueba
. Será un archivo ejecutable de Python:
$ cd ..
$ touch archivo_para_mover.py
$ ls -l
Para moverlo podemos usar dos estrategias:
Desde
~/taller_unix/3_manejo_terminal/
especificar que quiero mover el archivoarchivo_para_mover.py
hacia~/taller_unix/3_manejo_terminal/prueba
Desde
~/taller_unix/3_manejo_terminal/prueba
especificar que quiero mover el archivoarchivo_para_mover.py
hacia~/taller_unix/3_manejo_terminal/prueba
Si usamos la estrategia 1, operamos dentro de ~/taller_unix/3_manejo_terminal
y luego verificamos con ls
que este se haya movido correctamente hacia ~/taller_unix/3_manejo_terminal/prueba
:
$ mv archivo_para_mover.py prueba/
$ ls prueba
Si usamos la estrategia 2, primero devolvamos el archivo archivo_para_mover.py
de nuevo a ~/taller_unix/3_manejo_terminal
y después lo retornamos a ~/taller_unix/3_manejo_terminal/prueba
. Operamos dentro de ~/taller_unix/3_manejo_terminal/prueba
:
$ cd prueba
$ mv archivo_para_mover.py ..
$ mv ../archivo_para_mover.py ./
$ ls
Ahora, vamos a eliminar el directorio ~/taller_unix/3_manejo_terminal/prueba
porque ya no nos va a servir. Usamos el comando rm -r
. Operamos desde ~/taller_unix/3_manejo_terminal
.
$ cd ..
$ rm -r prueba
$ ls -l
Nota cómo el directorio ~/taller_unix/3_manejo_terminal/prueba
ya no existe dentro de ~/taller_unix/3_manejo_terminal
. Ya que hemos visto como elminiar directorios, ahora veremos como eliminar archivos. Creemos nuevamente el directorio ~/taller_unix/3_manejo_terminal/prueba
. Operamos desde ~/taller_unix/3_manejo_terminal
. Creamos un archivo ejecutable de C++.
$ mkdir prueba
$ touch prueba/borrar.cpp
$ cd prueba
$ ls
Ahora usamos el comando rm
sin ninguna opción. El argumento es borrar.cpp
. Vemos que ya no quedan más que los directorios ../
y /.
en la carpeta.
$ rm borrar.cpp
$ ls -a
5.5. Rutas absolutas y relativas¶
En el ejemplo anterior hemos usado rutas absolutas y relativas de manera satisfactoria. ¿Cómo? Una ruta absoluta es un directorio completo, desde el root directory. Una ruta relativa es un directorio incompleto y se especifica la dirección desde cualquier directorio actual de trabajo, sin necesidad que sea desde el root directory. Por ejemplo, si recordamos el ejemplo anterior, el archivo archivo_para_mover.py
debía moverse hacia ~/taller_unix/3_manejo_terminal/prueba
y operamos dentro de ~/taller_unix/3_manejo_terminal/prueba
. Lo logramos con el comando:
$ mv ../archivo_para_mover.py ./
Este comando significa: desde el directorio ~/taller_unix/3_manejo_terminal/prueba
, mover el archivo archivo_para_mover.py
que se encontraba en una carpeta anterior a ~/taller_unix/3_manejo_terminal/prueba
(es decir, en ~/taller_unix/3_manejo_terminal
) y moverlo al directorio actual. Para especificar el directorio anterior se usó ../
y para especificar el directorio actual se usó ./
.
Podíamos usar rutas absolutas para hacer la misma operación. En mi computador, el comando hubiera cambiado a:
$ mv /Users/j/taller_unix/3_manejo_terminal/archivo_para_mover.py /Users/j/taller_unix/3_manejo_terminal/prueba
Nota
Significan lo mismo, ya que especifican el directorio de inicio y el final, pero la ruta relativa es más abreviada. Hay que identificar las cuándo es conveniente trabajar con uno de ellos en particular. Se usan los directorios absolutos usualmente cuando se quiere revelar la locación de un archivo, o cuando se necesita rastrear cambios de ubicación. Los directorios relativos son fáciles de ejecutar y evitan la necesidad de usar nuestra memoria al escribir comandos.
5.6. Ejercicio: Directorios absolutos y relativos¶
Creemos varios subdirectorios dentro de ~/taller_unix/3_manejo_terminal/prueba
. Operamos desde ~/taller_unix/3_manejo_terminal
con los comandos:
$ cd ~/taller_unix/3_manejo_terminal
$ mkdir prueba/p1
$ mkdir prueba/p1/p2
$ mkdir prueba/p1/p2/p3
$ mkdir prueba/p1/p2/p3/p4
$ mkdir prueba/p1/p2/p3/p4/p5
$ cd prueba
Para ver nuestra jerarquía de carpetas podemos usar el comando. Operamos desde ~/taller_unix/3_manejo_terminal/prueba
. Usamos pwd
para descubrir la ruta actual:
$ ls -R
$ pwd
El directorio ./p1/p2/p3/p4/p5
es relativo porque usa ./
para especificar que se trabaja desde ~/taller_unix/3_manejo_terminal/prueba
, el directorio actual. Podemos entrar en ./p1/p2/p3/p4/p5
desde ~/taller_unix/3_manejo_terminal/prueba
y usar pwd
para revelar la ruta absoluta:
$ cd ./p1/p2/p3/p4/p5
$ pwd
Es evidente que ./p1/p2/p3/p4/p5
también significa /Users/j/taller_unix/3_manejo_terminal/prueba/p1/p2/p3/p4/p5
, ya que solo son dos formas de especificar un directorio: realtiva y absoluta. Ahora, regresemos a ~/taller_unix/3_manejo_terminal/prueba
de manera relativa. Usamos 5 veces ../
:
$ cd ../../../../..
$ pwd
Podemos borrar toda esta colección así:
$ rm -r p1
5.7. Ejercicio: Renombrar archivos y copiar archivos¶
A veces solo queremos renombrar un archivo. Esto se puede lograr mediante el comando
mv [nombre viejo] [nombre nuevo]
Es importante usar directorios, porque mv
trabaja con directorios. Usemos relativos porque es más fácil. Creemos un archivo Markdown renombrémoslo con un nombre bonito:
$ touch nombre_feo.md
$ ls -la
$ mv ./nombre_feo.md ./nombre_bonito.md
$ ls -la
Ahora, usemos el comando cp
para crear una copia de este archivo. Este comando es similar a mv
:
cp [nombre viejo] [nombre nuevo]
Primero lo copiamos en la misma carpeta. Hay que renombrarlo.
$ cp nombre_bonito.md ./nombre_bonito_2.md
$ ls -la
Podemos copiarlo incluso dentro de una carpeta. Si no vamos a generar un duplicado en la misma carpeta no es necesario cambiar el nombre. Podemos solo especificar el directorio de destino.
$ mkdir nueva_carpeta
$ ls
$ cp nombre_bonito.md ./nueva_carpeta
$ ls ./nueva_carpeta
Podemos borrar todo el contenido de ./prueba
:
$ rm *.md
$ rm -r nueva_carpeta