Navegación y manejo de directorios en la terminal
Sistemas Unix/Linux
Unix es una familia de sistemas operativos que nació a finales de los años 60 y sentó las bases de cómo funcionan hoy la mayoría de servidores, superordenadores y clústeres de cálculo científico. Linux es un sistema libre inspirado en Unix, y macOS es también un sistema Unix por debajo de la interfaz gráfica; ambos comparten muchas herramientas y la misma forma de trabajar en la terminal que veremos en este módulo. Windows no es Unix, pero puede ejecutar un entorno Linux completo mediante WSL.
En computación biológica casi todos los servidores, clústeres HPC y servicios en la nube donde se ejecutan los análisis bioinformáticos usan Linux, y las herramientas del campo (alineadores, ensambladores, pipelines) se documentan y distribuyen pensando en ese entorno. Aprender a moverte en la terminal de Linux es, además, transferible: los mismos comandos funcionan casi sin cambios en macOS y en WSL.
Distribuciones
Linux, como cualquier otro sistema operativo, se compone de un gran número de piezas, que, en este caso, son desarrolladas de forma independiente por miles de programadores y proyectos. Normalmente estas piezas son integradas por un distribuidor y Linux es suministrado como una distribución Linux. Las distribuciones Linux incluyen todo el software necesario para instalar un servidor o un escritorio. Algunas de las aplicaciones incluidas habitualmente son el navegador web Firefox y las aplicaciones de oficina LibreOffice.
Existen cientos de distribuciones Linux. Estas distribuciones están adaptadas para usuarios o tareas específicas. Algunas de estas distribuciones están desarrolladas o apoyadas por empresas como Fedora (Red Hat) y Ubuntu (Canonical) mientras que otras son mantenidas por la propia comunidad de usuarios como Debian.
Introducción a Ubuntu
Ubuntu es una distribución Linux basada en Debian y orientada a usuarios de escritorio.
Los usuarios
Los sistemas Unix son multiusuario, es decir, soportan que varios usuarios los utilicen simultáneamente. Todos los usuarios, excepto uno, tienen unos privilegios bastante restringidos y no pueden modificar el sistema. De este modo unos usuarios se ven protegidos de las acciones de los otros.
Existe un usuario especial llamado root con privilegios de administración absolutos sobre el sistema. Para realizar las tareas cotidianas nunca hay que acceder al sistema como root. En Ubuntu este usuario está deshabilitado por defecto y solo se pueden adquirir los privilegios de administrador temporalmente.
El sistema de ficheros: una jerarquía en árbol
En Linux, todos los archivos y directorios cuelgan de un único directorio raíz, escrito como /. Cualquier otro directorio es, directa o indirectamente, un subdirectorio de la raíz. Por ejemplo, /home es un subdirectorio de /, y dentro de /home cada usuario tiene el suyo propio: /home/alicia, /home/juan, etc. Esa estructura en forma de árbol es la misma idea que las carpetas anidadas de cualquier gestor de archivos gráfico — la terminal simplemente te obliga a nombrar el camino explícitamente en vez de hacer doble clic.
/
├── home
│ ├── alicia
│ │ └── documentos
│ └── juan
└── etc
Ejercicios
Para comprobar que no tenemos problemas de manejo del sistema vamos a realizar una serie de tareas:
Explorar el escritorio abriendo programas, moviéndote entre escritorios, minimizando y maximizando las aplicaciones, etc.
Navegar por los directorios del sistema de ficheros mediante el explorador de archivos.
Crear un subdirectorio llamado
tec_infen el escritorio.Crear un fichero de texto mediante el editor de textos gedit y guardarlo en el directorio que acabamos de crear.
Copiar el fichero anterior al directorio Documentos.
Eliminar el fichero original.
Bloquea la sesión de tu usuario y vuelve a entrar en ella.
La terminal de Unix
La Shell (o terminal) es un intérprete de comandos. Permite controlar el ordenador de forma textual. Frente a una interfaz gráfica, la terminal permite repetir tareas de forma exacta, automatizarlas mediante scripts y trabajar en servidores remotos que no tienen pantalla ni ratón, como es el caso de la mayoría de clústeres de cálculo.
No vamos a usar la terminal porque sea “más difícil” en ningún sentido de mérito, sino porque es la herramienta más eficaz para trabajar de forma reproducible en biología computacional. En general, las ventajas de la línea de comandos frente a una interfaz gráfica son:
Necesidad. Existe mucho software que está solo disponible en la terminal. Esto es especialmente cierto en el área de la bioinformática.
Flexibilidad. Los programas gráficos suelen ser muy adecuados para realizar la tarea para la que han sido creados, pero son difíciles de adaptar para otras tareas. Los programas diseñados para ser usados en la línea de comandos suelen ser muy versátiles.
Reproducibilidad. Documentar y repetir el proceso seguido para realizar un análisis con un programa gráfico es muy costoso puesto que es difícil describir la secuencia de clics y dobles clics que hemos realizado. Por el contrario, los procesos realizados mediante la línea de comandos son muy fáciles de documentar puesto que tan solo debemos guardar el texto que hemos introducido en la pantalla.
Fiabilidad. Los programas básicos de Unix fueron creados en los años 70 y han sido probados por innumerables usuarios por lo que se han convertido en piezas de código extraordinariamente confiables.
Recursos. Las interfaces gráficas suelen consumir muchos recursos mientras que los programas que funcionan en línea de comandos suelen ser extraordinariamente livianos y rápidos. Este poco uso de recursos facilita, por ejemplo, que se utilice a través de la red.
Al abrir la terminal, el sistema nos muestra un prompt que indica que está listo para recibir órdenes. En Ubuntu, el prompt suele ser similar a:
usuario@ordenador:~/Escritorio$
Este prompt indica que el usuario usuario está conectado al ordenador ordenador y que su directorio de trabajo actual es ~/Escritorio (el directorio Escritorio dentro del directorio personal del usuario, que se representa con ~).
¿Dónde estoy? — pwd y ls
pwd (print working directory) muestra el directorio en el que te encuentras. ls lista su contenido.
~$ pwd
/home/alumno
~$ ls
Desktop Documents Downloads- ¿Podrías listar el contenido del directorio en forma de lista larga, con información de permisos, propietario y fecha de modificación?
- ¿Cómo listarías también los archivos ocultos?
Moverte entre directorios — cd
Para cambiar de directorio se usa cd (change directory). Por ejemplo:
~$ cd Documents
~$ cd /home/alumno/DesktopRutas absolutas y relativas
Hay dos formas de indicar dónde está un archivo:
- Ruta absoluta: describe el camino completo desde la raíz, y siempre empieza por
/. Por ejemplo,/home/alicia/documentos/tesis.mdidentifica ese archivo sin importar en qué directorio te encuentres al escribirla. - Ruta relativa: describe el camino desde tu directorio de trabajo actual, y no empieza por
/. Sipwdte dice que estás en/home/alicia, entoncesdocumentos/tesis.mdes una ruta relativa equivalente a la absoluta anterior.
Tres atajos de notación que verás constantemente:
| Símbolo | Significado |
|---|---|
. |
el directorio actual |
.. |
el directorio padre (un nivel por encima) |
~ |
tu directorio personal ($HOME, p. ej. /home/alicia) |
Esto es lo que hace que cd .. funcione: .. es una ruta relativa que siempre significa “un nivel arriba en el árbol”, sin importar en qué rama del árbol estés.
Crear directorios y eliminar archivos — mkdir, rm
~$ mkdir proyecto_secuenciacion
~$ mkdir proyecto_secuenciacion/raw_data
~$ mkdir proyecto_secuenciacion/scripts proyecto_secuenciacion/results proyecto_secuenciacion/docsPara eliminar un archivo se usa rm (remove):
~$ rm proyecto_secuenciacion/docs/README.md- Crea una carpeta llamada
testy crea un archivo llamadoprueba.txtdentro de él (para crear el archivo usa el programatouch). - Comprueba desde el terminal que el archivo existe.
- Elimina el archivo.
- Elimina la carpeta.
Para eliminar un directorio con contenido hace falta rm -r (recursivo):
~$ rm -r proyecto_secuenciacion/resultsrm no tiene papelera: lo que borras con rm desaparece de forma permanente. Antes de usarlo con * o rutas amplias, comprueba con ls que estás en el directorio correcto y que la ruta es exactamente la que quieres borrar.
Copiar, mover y renombrar — cp, mv
cp (copy) copia archivos o directorios. La estructura básica es cp origen destino. Por ejemplo:
~$ touch sampling_data.txt
~$ cp sampling_data.txt sampling_data_backup.txt- Crea un directorio, con un subdirectorio y un archivo dentro.
- Copia todo el directorio a otro directorio
mv (move) mueve o renombra. El funcionamiento básico es: - Mover: mv origen destino mueve el archivo o directorio origen a la ruta destino. - Renombrar: mv origen nuevo_nombre cambia el nombre del archivo o directorio.
~$ mv sampling_data.txt sampling_data_2024.txt
~$ mkdir backup
~$ mv sampling_data_backup.txt backup/Wildcards
En muchas ocasiones resulta útil tratar los ficheros de un modo conjunto. Por ejemplo, mover todos los ficheros de texto a un directorio y las imágenes a otro.
Creemos una pequeña demostración:
~$ touch exp_1a.txt
~$ touch exp_1b.txt
~$ touch exp_1b.jpg
~$ touch exp_1a.jpg- Independientemente, de las herramientas que ya conoces, ¿cómo lo harías? ¿Qué lógica general seguirías para mover los ficheros de texto a un directorio y las imágenes a otro?
Los wildcards son caracteres especiales que permiten referirse a un conjunto de ficheros que cumplen un patrón determinado. El más común es el asterisco *, que sustituye a cualquier texto. Por ejemplo, para mover todos los archivos de texto a un directorio llamado exp_1 podríamos hacer:
~$ mv *txt exp_1
~$ ls
exp_1 exp_1a.jpg exp_1b.jpgEl asterisco sustituye a cualquier texto, por lo que al escribir *txt incluimos a cualquier fichero que tenga un nombre cualquiera, pero que termine con las letras txt. Podríamos, por ejemplo, referirnos a los ficheros del experimento 1a:
~$ ls *1a*
exp_1a.jpgEsta herramienta es muy potente y útil, pero tenemos que tener cuidado con ella, sobre todo cuando la combinamos con rm.
Por ejemplo, la orden:
$ rm -r *Borraría todos los ficheros y directorios que cuelgan del directorio de trabajo actual. Puede que esto sea lo que queramos, pero hemos de andar con cuidado.
Ejercicios
- Crea la estructura de directorios
proyecto_campo/{raw_data,scripts,results}con una sola línea demkdir. - Sitúate dentro de
proyecto_campo/raw_data. Ahora muévete aproyecto_campo/scriptsusando rutas relativas, y por último vuelve araw_datapero esta vez escribiendo la ruta absoluta completa. - Dentro de
raw_data, crea estos cuatro archivos vacíos contouch:
touch "Muestra 01.fastq" muestra_02.FASTQ MUESTRA-03.fastq muestra_4.fastq- Lista el contenido de
raw_dataconls -ly anota qué tres cosas distintas varían entre estos nombres (pista: mayúsculas, separador, ceros a la izquierda). - Renombra los cuatro archivos con la convención
muestra_00.fastq - Crea una copia de seguridad de todo
raw_datallamadaraw_data_backup. - Elimina
raw_data.