10 comandos básicos de la terminal

Introducción

¡Bienvenido! Si estás leyendo este manual de algún modo ya sabes de la potencia de usar la interfaz de línea de comandos en lugar de interfaces gráficas.

Pero con probabilidad ese entusiasmo muta en frustración al abrir la terminal. Sí, sabes que ahí se ponen los comandos y hasta has ejecutado algunos… usando copiar y pegar…

En este manual se verá una introducción breve a diez comandos muy comunes en la terminal:

  1. ls. Enlista los ficheros que contiene un directorio.

  2. pwd. Imprime la ubicación actual.

  3. mkdir. Crea un nuevo directorio.

  4. cd. Cambia de directorio.

  5. nano. Crea o edita archivos.

  6. cat. Muestra el contenido de archivos y más.

  7. mv. Mueve o renombra ficheros.

  8. cp. Copia ficheros.

  9. rm. Elimina ficheros.

  10. clear. Limpia la terminal.

La terminal en una iteración infinita clamando por tu ayuda.
La terminal en una iteración infinita clamando por tu ayuda.

Qué es y qué no es este manual

En este manual no encontrarás:

En este manual sí encontrarás:

1. Érase una vez en tu hogar: ls

Como es común en cualquier sistema operativo, la manera en como interactuamos es a través de ventanas. Con esta aproximación y usando un explorador de archivos podemos ver las carpetas —también llamadas «directorios»— y archivos que de manera indistinta ambos se conocen como «ficheros». Cuando abrimos este explorador por lo general nos sitúa en nuestro home.

La carpeta home es una de las más populares e importantes entre nuestros ficheros. Ahí ponemos todos los archivos que creamos o descargamos. Su importancia es tal que en efecto es tu hogar: ahí guardamos lo más íntimo y oscuro, así como su orden es proporcional al orden de tu vida diaria…

Ventana que muestra el directorio home y su contenido.
Ventana que muestra el directorio home y su contenido.

La terminal no es tan distinta. Una de las principales diferencias es que interactuamos a través de comandos en lugar de ventanas. Cuando abrimos la terminal por lo regular nos colocará en nuestro home.3

Terminal recién abierta que nos sitúa en el home.
Terminal recién abierta que nos sitúa en el home.

Lo que a primera vista vemos es un texto ya impreso: nika-zhenya en ~ $. Este se conoce como prompt y entre muchas cosas nos indica que la terminal ¡está a la espera de tus órdenes!

Pero antes de lanzar comandos, veamos en qué consiste comúnmente el prompt. El prompt por lo general y según el estilo de la terminal contiene tres elementos:

  1. Nombre del usuario. En el caso de la imagen es nika-zhenya.

  2. Ubicación actual. Aquí sería ~, una manera abreviada de indicar la carpeta del usuario nika-zhenya. Es decir, ~ es igual a /home/nika-zhenya: el hogar de Nika Zhenya.

  3. Fin del prompt. El símbolo $ indica que lo que viene a continuación son tus comandos. Aunque $ es lo más común para señalar el final, puede haber otros símbolos en su lugar como #.

Con estos elementos muy fácilmente podemos traducir nika-zhenya en ~ $ por «Este es el usuario Nika Zhenya y estás en su hogar, ¿qué deseas hacer?». ¡Queremos ver lo que hay en la casa! Como no interactuamos con ventanas, sino con comandos, escribimos:

                ls
            
Uso de ls para mostrar el contenido de home.
Uso de ls para mostrar el contenido de home.

Vaya, vaya, vaya, ahora podemos ver los ficheros que están adentro de nuestro hogar, tal cual como los podemos ver cuando abrimos el explorador de archivos. Pero no nos quedemos ahí. Así como en nuestro explorador podemos ver los archivos ocultos, también podemos hacerlo desde la terminal.

Vista de archivos ocultos del home desde el explorador de archivos.
Vista de archivos ocultos del home desde el explorador de archivos.

Para poder ver los archivos ocultos desde la terminal, ejecutamos:

                ls -a
            
Vista de archivos ocultos del home desde la terminal con ls -a.
Vista de archivos ocultos del home desde la terminal con ls -a.

Los archivos ocultos por lo general son ficheros de configuración de diversos programas que utilizas. Como ves, un fichero oculto siempre empieza con un punto, por ejemplo .fonts o .icons. Pero en no pocas ocasiones también demuestra qué tanto mantenimiento le das a tu hogar… Así que mejor los volvemos a esconder debajo de la alfombra.

En nuestro explorador de archivos también tenemos una opción de ver los ficheros a detalle. Así podemos ver cantidad de elementos, fechas de modificación y más.

Vista a detalle de los ficheros adentro del home desde el explorador de archivos.
Vista a detalle de los ficheros adentro del home desde el explorador de archivos.

Como puedes imaginarlo, esto también lo podemos hacer desde la terminal si le ordenas:

                ls -l
            
Vista a detalle de los ficheros adentro del home desde la terminal con ls -l.
Vista a detalle de los ficheros adentro del home desde la terminal con ls -l.

Mucha de esta información para el uso básico tiene poco sentido. Nos quedaremos ahí, recuerda que puedes usar el pato o man o -h (o --help) para más información.

¿Quieres ver los archivos ocultos y una vista a detalle? No hay problema, solo ejecuta:

                ls -a -l
            

O en su versión abreviada:

                ls -al
            

O hasta al revés:

                ls -la
            

Con cualquier de las formas obtendrás el mismo resultado.

Vista a detalle y con ficheros ocultos del home desde la terminal con ls -la.
Vista a detalle y con ficheros ocultos del home desde la terminal con ls -la.

Como la interacción a través de comandos puede volverse compleja, existe un consenso en que la sintaxis se pueda escribir de la manera más compacta y sencilla posible. Por eso es que muchas de las opciones de los comandos —también conocidos como «parámetros» o «flags»— pueden unirse o escribirse casi en cualquier orden.

¿Qué significa ls? Se trata de una abreviatura de list. Al ejecutar ls lo que le ordenamos a la terminal es que nos muestre una lista de los ficheros que contiene el directorio en donde nos encontramos. Sin embargo, queremos más que eso…

2. Pero ¿qué pasó ayer?: pwd

En más de una ocasión al llegar a nuestra casa después de una buena parranda nos olvidamos de dónde están las cosas. ¡Hip!, ¿dónde está el baño? Oh, no, mañana alguien se llevará una sorpresa…

Lo mismo pasa cuando estamos en nuestro hogar digital. En ocasiones simplemente ignoramos dónde estamos.

En el explorador de archivos por lo general siempre tenemos a la vista nuestra ubicación en la barra superior, abajo del menú.

Posicionamiento de la vista en la barra superior del explorador de archivos.
Posicionamiento de la vista en la barra superior del explorador de archivos.

En la terminal, según su configuración del prompt u otras cuestiones, puede darse el caso que no tengas una manera sencilla de saber dónde te encuentras.

Para tener la información a la mano, basta con ejecutar:

                pwd
            
Impresión de la ubicación actual desde la terminal con pwd.
Impresión de la ubicación actual desde la terminal con pwd.

No importa qué es lo que pase, con pwd siempre sabrás dónde terminaste. Nada de resacas ni crudas morales.

¿Qué significa pwd? Es una abreviatura de print working directory. Con este comando ordenamos a la terminal que nos indique cuál es el directorio donde estamos trabajando.

3. Un poco de diversión: mkdir

Ver lo que está adentro del home y siempre tener la brújula del pwd es muy útil. Pero también muy aburrido. Una manera de divertirnos un poco es empezar a crear más directorios.

Con el explorador de archivos la creación es muy sencilla: con clic derecho podemos crear una nueva carpeta.

Desde la terminal también podemos hacer lo mismo si ejecutamos:

                mkdir borrame
            
Creación de un directorio desde la terminal con mkdir.
Creación de un directorio desde la terminal con mkdir.

Con este comando estaremos creando una nueva carpeta con el nombre «borrame». Puedes comprobarlo si abres tu explorador de archivos.

Vista de la carpeta creada (resaltada con verde) desde el explorador de archivos.
Vista de la carpeta creada (resaltada con verde) desde el explorador de archivos.

Pero como ya viste, también puedes corroborarlo si ejecutas ls.

Vista de la carpeta creada (resaltada con verde) desde la terminal.
Vista de la carpeta creada (resaltada con verde) desde la terminal.

¿Deseas crear una carpeta adentro de un directorio? No hay problema, escribe:

                mkdir borrame/nivel1-a
            

¿Quieres crear múltiples carpetas adentro de un directorio? Puedes señalar diferentes directorios si los separas con un espacio:

                mkdir borrame/nivel1-b borrame/nivel1-c
            

Hasta puedes crear una subcarpeta adentro de una carpeta que a su vez está adentro de otro directorio:

                mkdir borrame/nivel1-a/nivel2-a
            
Creación de carpetas y subcarpetas en un mismo directorio desde la terminal.
Creación de carpetas y subcarpetas en un mismo directorio desde la terminal.

Toma un tiempo en analizar todos los comandos que acabas de ejecutar. Puede ser muy confuso al principio. Por fortuna si ves el explorador de archivos, puedes observar la estructura que acabas de crear adentro de borrame.

Vista de los contenidos de borrame desde el explorador de archivos.
Vista de los contenidos de borrame desde el explorador de archivos.

Puedes hacer algo análogo en la terminal si, por ejemplo, ejecutas ls borrame o ls borrame/nivel1-a.4

Vista de los contenidos de borrame desde la terminal con ls.
Vista de los contenidos de borrame desde la terminal con ls.

De esta manera podemos crear directorios sin ningún problema. Pero hay dos detalles que se tienen que mencionar para empezar a comprender un aspecto muy importante de la terminal: el uso de rutas, también conocidas como paths.

La estructura que creamos con mkdir es la siguiente:

                borrame├── nivel1-a│   └── nivel2-a├── nivel1-b└── nivel1-c
            

Con esto tenemos que borrame es el nivel 0 —es un número relativo, no lo tomes tan en serio—. Todo lo que este fichero contiene de manera inmediata está en el nivel 1, como nivel1-a, nivel1-b y nivel1-c. Por último, tenemos una subcarpeta nivel2-a en el nivel 2, ya que está adentro de la carpeta nivel1-a.

La manera visual en como el explorador de archivos muestra este anidamiento es mediante el uso de flechas y espacios, conocidos como acordeones.

Vista a detalle del acordeón que muestra el explorador de archivos.
Vista a detalle del acordeón que muestra el explorador de archivos.

Para poder expresar esta ruta desde la terminal necesitamos de un delimitador por el cual se pueda distinguir un nivel de otro. Para esto se usa la barra (/). Por ejemplo, esta ruta:

                borrame└── nivel1-a    └── nivel2-a
            

Es lo mismo a decir: «De la carpeta borrame nos movemos a la carpeta nivel1-a para de nuevo movernos a la carpeta nivel2-a». Es decir, estamos expresando: «Nivel 0 > Nivel 1 > Nivel 2» que en este ejemplo es borrame > nivel1-a > nivel2-a. Para escribir esta ruta con una sintaxis correcta basta con sustituir > por /: borrame/nivel1-a/nivel2-a.

Para comprobar que esta ruta existe puedes ejecutar ls borrame/nivel1-a/nivel2-a… ¡No te mostrará nada, porque el fichero nivel2-a está vacío!

En cambio, si ejecutas:

                ls borrame/nivel1-a/nivel2-b
            
Intento de enlistar los contenidos de una carpeta inexistente desde la terminal.
Intento de enlistar los contenidos de una carpeta inexistente desde la terminal.

Nos muestra un error porque en efecto no tenemos una subcarpeta nivel2-b adentro de la carpeta nivel1-a del fichero borrame. El uso de ls puede ser de gran ayuda para indagar cuando una ruta es inexistente o simplemente está mal escrita.

El segundo gran detalle es el nombre de los archivos. Como puedes observar, las carpetas que acabamos de crear tienen las siguientes características en su sintaxis:

Esto no se debe a que la terminal es incapaz de reconocer mayúsculas, espacios o tildes. Por comodidad es más sencillo emplear este consenso para escribir las rutas. No solo es más claro para ti, también puedes evitar conflictos con las rutas cuando uses otros programas desde la terminal.

Solo son ficheros, ¿vale? Aunque la redacción correcta y más agradable sea «Bórrame» o «Nivel 1 a», por comodidad es mejor dejarlas como borrame o nivel1-a o nivel_1_a. Como quieras, ¡ahora puedes crear carpetas con el nombre que te agrade!

¿Qué significa mkdir? Es una abreviación de make directory. Con este comando le decimos a la terminal que haga directorios.

4. Clases de cumbia: cd

Ya no queremos estar en el home, ¡hay que empezar a bailar!

Con el explorador de archivos el movimiento es muy sencillo: por medio de clics o presionando Enter sobre los directorios cambiamos de un lugar a otro. Lo que en realidad hacemos es indicar con el puntero la serie de pasos a seguir para llegar a una ubicación específica.

Con la terminal es prácticamente lo mismo. Por ejemplo, nuestro primer paso es ir hacia el fichero borrame. ¿Listo? Uno, ejecuta:

                cd borrame
            
Primer paso de la cumbia linuxera.
Primer paso de la cumbia linuxera.

Dos:

                cd nivel1-a
            
Segundo paso de la cumbia linuxera.
Segundo paso de la cumbia linuxera.

Tres:

                cd ..
            
Tercer paso de la cumbia linuxera.
Tercer paso de la cumbia linuxera.

Cuatro:

                cd ..
            
Cuarto paso de la cumbia linuxera.
Cuarto paso de la cumbia linuxera.

Analicemos un poco los pasos. En el primero nos fuimos hacia adelante:

                home──> borrame
            

Esto lo puedes comprobar con el prompt ya que una vez hecho el paso puedes ver que tu ubicación es ~/borrame y ya no ~.

El segundo paso también fue hacia adelante:

                home──> borrame    ──> nivel1-a
            

De nuevo puedes corroborarlo con el prompt o incluso puedes utilizar otros comandos que ya usamos, como ls o pwd.

Con el tercer paso retrocedimos un poco:

                home──> borrame    <── nivel1-a
            

Así como el cuarto paso sirvió para que regresáramos a nuestro home:

                home<── borrame
            

Aquí hay algo interesante para resaltar. Como ya vimos, para indicar rutas en la terminal usamos la sintaxis nivel_0/nivel_1/nivel_2. Esto es lo mismo a «Nivel 0 > Nivel 1 > Nivel 2».

Pero esta sintaxis nos hace ir hacia adelante… Solo nos permite ir cada vez más adentro de nuestros ficheros. No obstante, ¿cómo podemos regresar? ¿Cómo es posible ir a un nivel más arriba?

Con nuestro explorador de archivos es tan sencillo como usar el botón o la tecla de retroceso. En la terminal también es muy fácil: con dos puntos consecutivos (..) indicamos un paso hacia atrás.

Es decir, cada vez que quieras ir para atrás imagina que nuestro botón de retroceso en la terminal es un simple ...

Con este conocimiento, más lo que hemos estado aprendiendo sobre las rutas, ¡es posible dar los pasos más rápidos! Vamos, uno, dos:

                cd borrame/nivel1-a
            
Primer y segundo paso de la cumbia linuxera: para adelante.
Primer y segundo paso de la cumbia linuxera: para adelante.

¡Ahora tres, cuatro!:

                cd ../..
            
Tercer y cuarto paso de la cumbia linuxera: para atrás.
Tercer y cuarto paso de la cumbia linuxera: para atrás.

Podemos ir incluso más adentro:5

                cd borrame/nivel1-a/nivel2-a
            

Y regresar:

                cd ../../..
            

Ahora bien, suponiendo que tenemos más niveles adentro de borrame, ¿cómo haríamos para regresar a nuestro home? Bien podemos irnos para atrás n número de veces con ...

Sin embargo, hay veces que ya estamos tan adentro que ese tipo de retorno se vuelve poco practico. Para estos casos siempre desde cualquier ubicación podemos regresar a nuestro home al ejecutar:

                cd
            
Regreso al home desde la terminal usando cd.
Regreso al home desde la terminal usando cd.

Como puedes adivinar, si al comando cd no le indicas ninguna ruta, este considerará que quieres regresar al home.

Así ya tenemos tres elementos muy importantes para considerar en nuestras rutas:

  1. Para indicar la diferencia entre niveles usamos /.

  2. Para avanzar solo escribimos el nombre del siguiente fichero que está adentro del fichero que le antecede.

  3. Para retroceder basta con ...

Entonces, ¿a dónde vamos si ejecutamos lo siguiente?

                cd borrame/nivel1-a/../
            
Más pasos de la cumbia linuxera: hacia adelante y adelante y hacia atrás.
Más pasos de la cumbia linuxera: hacia adelante y adelante y hacia atrás.

¡A borrame! ¿Cómo? Veamos los pasos:

                home──> borrame    ──> nivel1-a    <── nivel1-a
            

Con estos sencillos pasos hacia adelante y hacia atrás cuentas con un sin fin de combinaciones que te permitirán ir a cualquier parte de tus ficheros. ¿Quieres probarlo? Siente el ritmo de tu terminal y ponte a bailar aquí y allá.

¿Qué significa cd? Se trata de una abreviación para change directory. Al ejecutar cd lo que le pedimos a la terminal es que nos acompañe a bailar al son del cambio de directorios.

5. Y el verbo se hizo bit: nano

Al fin podemos movernos desde la terminal y crear directorios. Pero ¿acaso no podemos también crear documentos? En el explorador de archivos al hacer clic derecho podemos crear nuevos archivos en blanco.

Con la terminal podemos hacer lo mismo con nano.6 Por ejemplo, adentro de borrame ejecutemos:

                nano mi_primer_archivo
            
Entorno al ejecutar nano en la terminal.
Entorno al ejecutar nano en la terminal.

¡De manera inmediata nano nos muestra su entorno para poder empezar a redactar! Qué tal si escribimos:

                Hola, mundo.
            

Para salir presionamos Ctrl + X.7 Nos preguntará si queremos guardar los cambios, a lo que responderemos que sí con Y o S y pulsamos Enter.

Desde el explorador de archivos puedes comprobar que ¡el archivo existe!

El fichero mi_primer_archivo visto desde el explorador de archivos.
El fichero mi_primer_archivo visto desde el explorador de archivos.

Y como bien sabes, también puedes verlo si ejecutas ls.

El fichero mi_primer_archivo visto desde la terminal con ls.
El fichero mi_primer_archivo visto desde la terminal con ls.

Al intentar abrir el archivo haciendo clic desde el explorador de archivos te puede ocurrir algo de lo siguiente:

  1. Te lo abrirá en tu editor de texto por defecto como puede ser Gedit, TextEdit o Bloc de notas.

  2. Te preguntará con qué programa quieres abrir el archivo.

  3. Te indicará que el fichero no pudo ser abierto.

Esto sucede porque nos acercamos a una distinción rara vez percibida por la mayoría de los usuarios. En un entorno gráfico y en el uso de software propietario tendemos a confundir el tipo de archivo con el programa.

Un ejemplo clásico es el archivo DOCX de Microsoft. ¿Cuántas veces en lugar de llamarlo DOCX dijiste «Archivo de Word»? En efecto Microsoft creó el formato DOCX para abrirlo con Microsoft Word. Sin embargo, una cuestión es el tipo de archivo —el DOCX— y el programa con el que abrimos el archivo —Microsoft Word—.

Como usuarios tendemos a asociar de manera unívoca un tipo de archivo con un programa. Incluso llegamos al punto de pensar que para cierto tipo de documento necesitamos algún programa específico.

Regresando al ejemplo, podemos darnos cuentas que son cosas distintas cuando:

  1. Abrimos el DOCX con otro programa, como LibreOffice Writer.8

  2. Usamos Microsoft Word para abrir otros formatos como DOC, RTF, TXT o HTM.

Para evitar que el explorador de archivos intente descifrar cuál es el programa más conveniente para abrir el documento, lo mejor es guardarlo ya con una extensión definida. La extensión son esas letras que vienen después de un punto en los archivos como .txt, .md o .docx. Con esto indicamos que ese fichero es un archivo de texto plano, un documento de Markdown o un «Archivo de Word», respectivamente.

Entonces, hagamos nuestro segundo documento con nano:

                nano mi_segundo_archivo.txt
            

Escribe «Hola de nuevo, mundo.», cerramos y guardamos: Ctrl + X, Y y Enter. Ahora si lo intentas abrir desde tu explorador de archivos, no tendría que haber ningún problema.

El fichero mi_segundo_archivo.txt visto desde LibreOffice Writer.
El fichero mi_segundo_archivo.txt visto desde LibreOffice Writer.

Como ya te has dado cuenta, puedes editar tus archivos creados con nano desde cualquier editor de tu conveniencia: no necesitas hacerlo todo desde la terminal. También puedes editar desde nano archivos creados con otros programas.

¿Puedo crear o editar cualquier tipo de documento con nano? Por desgracia no. Desde la terminal solo podemos crear correctamente y editar archivos de texto plano. Se trata de ficheros que no tienen ningún formato tipográfico, aunque sí es posible trabajar con archivos de lenguaje de marcado como Markdown, HTML, XML o TeX.

Intento fallido de editar con nano un archivo DOCX que solo contiene «Hola, mundo».
Intento fallido de editar con nano un archivo DOCX que solo contiene «Hola, mundo».

Aunque por comodidad preferimos trabajar con editores de texto con entornos gráficos, nano es una buena opción para crear archivos de manera instantánea o para hacer ediciones rápidas.

¿Qué significa nano? Es un acrónimo recursivo que indica: «Nano's ANOther editor». Sí, a los programadores les encantan las bromas «recursivas». Aunque no sean tan graciosas…

6. La curiosidad ¿mató al gato?: cat

El comando nano puede ser muy versátil. Pero hay ocasiones que por urgencia o comodidad solo queremos ver el contenido de los archivos.

En el explorador de archivos de algunos sistemas operativos podemos ver rápidamente su contenido. Muchas veces no es cómodo y solo nos muestra los primeros caracteres.

En la terminal tenemos un comando que nos permite curiosear: cat. Mejor que explicarlo, por qué no ejecutas:

                cat mi_primer_archivo && cat mi_segundo_archivo.txt
            
Los contenidos de los ficheros mi_primer_archivo y mi_segundo_archivo.txt vistos desde la terminal con cat.
Los contenidos de los ficheros mi_primer_archivo y mi_segundo_archivo.txt vistos desde la terminal con cat.

La terminal nos ha arrojado los contenidos de ambos archivos según el orden indicado. También puedes ver únicamente el contenido de un archivo, solo simplifica el comando anterior:

                cat mi_primer_archivo
            
El contenido del fichero mi_primer_archivo visto desde la terminal con cat.
El contenido del fichero mi_primer_archivo visto desde la terminal con cat.

Aquí tenemos algunas consideraciones relevantes. Primero, tal como nano, con cat:

En otro aspecto, como puedes ver en el primer ejemplo de cat, es posible ejecutar varios comandos en una sola línea con &&. Esta sintaxis indica una conjunción: cat mi_primer_archivo + cat mi_segundo_archivo.txt. Puede ser cualquier comando, por ejemplo:

                ls -l && cat mi_primer_archivo
            
Lista del fichero borrame y vista del contenido de mi_primer_archivo desde la terminal con ls y cat.
Lista del fichero borrame y vista del contenido de mi_primer_archivo desde la terminal con ls y cat.

En realidad el comando cat mi_primer_archivo && cat mi_segundo_archivo.txt fue una excusa para mostrar cómo hacer conjunciones con Bash. Si solo usas cat para varios archivos, puedes ejecutar de manera más simplificada:

                cat mi_primer_archivo mi_segundo_archivo.txt
            
El contenido del fichero mi_primer_archivo visto de manera más sencilla desde la terminal con cat.
El contenido del fichero mi_primer_archivo visto de manera más sencilla desde la terminal con cat.

Basta con separar cada ruta con al menos un espacio para indicarle a cat que estamos trabajando con varios archivos al mismo tiempo.

Pero esto no es todo, ¿qué tal si no solo quieres ver varios archivos, sino crear uno nuevo que contenga todo ese contenido? Podemos valernos de otro operador de Bash: >.9 Con este ordenamos que todo lo que se encuentre al lado izquierdo se vierta en el fichero del lado derecho:

                cat mi_primer_archivo mi_segundo_archivo.txt > mi_tercer_archivo.txt
            

Al parecer no ha sucedido nada… ¿y si enlistamos los ficheros y hacemos cat a mi_tercer_archivo.txt?

                ls -l && cat mi_tercer_archivo.txt
            
Lista del fichero borrame y vista del contenido de mi_tercer_archivo.txt desde la terminal con ls y cat.
Lista del fichero borrame y vista del contenido de mi_tercer_archivo.txt desde la terminal con ls y cat.

Si aún no lo crees, puedes abrir el archivo en cualquier editor de texto…

Vista del contenido de mi_tercer_archivo.txt desde un editor de texto.
Vista del contenido de mi_tercer_archivo.txt desde un editor de texto.

El comando cat es muy poderoso porque nos permite realizar muestreos rápidos y unir contenidos. Pero por lo mismo puede ser peligroso. Si al momento de concatenar archivos, el fichero final (el que está al lado derecho de >) tiene el mismo nombre que uno de los documentos de entrada (los que estén al lado izquierdo de >), provocarás que ese archivo tenga un nuevo contenido…

El comando cat no pregunta por permiso y es muy curioso. Recuerda que a los gatos no puedes domarlos.

¿Qué significa cat? No es honor a los felinos, sino de concatenate. Con cat podemos ver pero principalmente concatenar archivos.

7. Ya lo sé que tú te vas: mv

Ya sabemos cómo crear ficheros, editarlos, mostrarlos y unirlos. Pero tenemos poco o nada de control sobre nuestros archivos si no podemos cambiarlos de lugar.

Para mover archivos solo tenemos que indicar cuáles son los ficheros de origen y al final cuál es el directorio destino. Por ejemplo, ejecuta:

                mv mi_primer_archivo nivel1-a/nivel2-a/
            

Como es común, la terminal no te comentará nada, pero bien puedes enlistar la carpeta nivel1-a/nivel2-a/ para corroborarlo (o ver el explorador de archivos):

                ls nivel1-a/nivel2-a/
            
Traslado de mi_primer_archivo a nivel1-a/nivel2-a/ desde la terminal con mv.
Traslado de mi_primer_archivo a nivel1-a/nivel2-a/ desde la terminal con mv.

Tal como vimos con cat podemos trabajar con varios ficheros al mismo tiempo. ¿Quieres mover mi_segundo_archivo.txt y mi_tercer_archivo.txt a nivel1-c?, ejecuta:

                mv mi_segundo_archivo.txt mi_tercer_archivo.txt nivel1-c && ls nivel1-c
            
Traslado y vista de mi_segundo_archivo.txt y mi_tercer_archivo.txt a nivel1-c desde la terminal con mv y ls.
Traslado y vista de mi_segundo_archivo.txt y mi_tercer_archivo.txt a nivel1-c desde la terminal con mv y ls.

Hasta aquí, tu árbol de directorios debería de lucir así:

                .├── nivel1-a│   └── nivel2-a│   └── mi_primer_archivo├── nivel1-b└── nivel1-c ├── mi_segundo_archivo.txt └── mi_tercer_archivo.txt
            

¿Qué es ese punto? Así como hemos visto que los dos puntos consecutivos (..) indican un nivel más arriba en la jerarquía, el punto (.) señala el directorio actual. En este caso . es igual a borrame.

Como en la terminal siempre se busca escribir lo menos posible, ese punto puede ser muy útil al momento de trabajar. Por ejemplo, regresemos a mi_primer_archivo a nuestro fichero borrame:

                mv nivel1-a/nivel2-a/mi_primer_archivo . && ls -l
            
Traslado y vista de mi_primer_archivo a borrame desde la terminal con mv y ls.
Traslado y vista de mi_primer_archivo a borrame desde la terminal con mv y ls.

El punto es relativo, por lo que si nos movemos a nivel1-b con cd:

                cd nivel1-b
            

Ahora el directorio nivel1-b es ..

Con lo que hemos visto de las rutas, más el significado de los dos puntos consecutivos o del punto contamos, ya con todos los elementos necesarios para movernos y más.

Podemos mover todos los archivos .txt al directorio nivel1-b si ejecutamos:

                mv ../nivel1-c/*.txt . && ls
            
Traslado y vista de los archivos .txt a nivel1-b desde la terminal con mv y ls.
Traslado y vista de los archivos .txt a nivel1-b desde la terminal con mv y ls.

Momento, ¿qué quiere decir *.txt? No hay ningún archivo que se llame así. En la carpeta nivel1-c habíamos enviado a mi_segundo_archivo.txt y mi_tercer_archivo.txt, pero ¡ninguno se llama *.txt!

El asterisco (*) es un símbolo que en Bash se emplea como un comodín y puede ser usado en cualquier comando no solo en mv. Con *.txt se expresó «cualquier cosa con terminación .txt». Los archivos mi_segundo_archivo.txt y mi_tercer_archivo.txt cumplen con esa condición.

Este comodín puede ir en cualquier lugar. Por ejemplo, ejecuta:

                mv mi_* .. && cd .. && ls
            
Traslado y vista de los archivos mi_* a borrame desde la terminal con mv, cd y ls.
Traslado y vista de los archivos mi_* a borrame desde la terminal con mv, cd y ls.

Aunque la sintaxis del pasado comando ya la hemos trabajado, quizá valga la pena ver qué fue lo que hicimos:

  1. En una sola línea ejecutamos tres comandos (mv, cd y ls) los cuales fueron separados por &&.

  2. Con mv mi_* .. ordenamos mover todos los archivos que inician con mi_ a un nivel más arriba. Como estábamos en nivel1-b, quiere decir que borrame fue el destino.

  3. Con cd .. solo nos regresamos a borrame.

  4. Para terminar, ls se ha estado usando para mostrar el contenido de borrame. No era necesario ejecutarlo, solo fue ilustrativo.

Con todos los movimientos, ahora tendrías que tener esta estructura:

                .├── mi_primer_archivo├── mi_segundo_archivo.txt├── mi_tercer_archivo.txt├── nivel1-a│   └── nivel2-a├── nivel1-b└── nivel1-c
            

Con mv también podemos mover carpetas. Qué tal si creamos primero una llamada nivel2-c:

                mkdir nivel2-c
            

Ahora metamos todos los archivos en ese directorio con un comodín. No podemos hacerlo con *.txt porque ¡mi_primer_archivo no tiene extensión! Pero todos empiezan con mi_, así que podemos ejecutar:

                mv mi_* nivel2-c && ls
            
Traslado y vista de los archivos mi_* a nivel2-c desde la terminal con mv y ls.
Traslado y vista de los archivos mi_* a nivel2-c desde la terminal con mv y ls.

¡Ups! Revisando la estructura, la hemos regado un poco:

                .├── nivel1-a│   └── nivel2-a├── nivel1-b├── nivel1-c└── nivel2-c ├── mi_primer_archivo ├── mi_segundo_archivo.txt └── mi_tercer_archivo.txt
            

La carpeta nivel2-c tuvimos que haberla creado adentro del fichero nivel1-c. ¡No hay problema!, ejecutemos:

                mv nivel2-c nivel1-c
            

¡Listo! ya hemos movido también una carpeta. Nuestra estructura quedaría como la siguiente:

                .├── nivel1-a│   └── nivel2-a├── nivel1-b└── nivel1-c └── nivel2-c ├── mi_primer_archivo ├── mi_segundo_archivo.txt └── mi_tercer_archivo.txt
            

¿Qué significa mv? Aunque bien las siglas corresponden a «mover», es una abreviatura para move. Sí, los comandos por lo regular son shortcuts de palabras en inglés…

8. Copiar y pegar en un solo comando: cp

Para los defensores del copyright no hay peor mal que el copy & paste. Por fortuna en los mundos de GNU, Linux y Bash todos aman las copias.

En el explorador de archivos tenemos la función de copiar y pegar separadas. Sin embargo, desde la terminal esta tarea se realiza en una sola línea. Su sintaxis es muy similar a mv: los ficheros a copiar, conocidos como origen, se colocan antes del fichero destino, el cual es el último elemento.

Por ejemplo, empecemos por copiar a mi_primer_archivo en borrame:

                cp nivel1-c/nivel2-c/mi_primer_archivo . && ls
            
Copia y vista del archivo mi_primer_archivo a borrame desde la terminal con cp y ls.
Copia y vista del archivo mi_primer_archivo a borrame desde la terminal con cp y ls.

Como puedes observar, el archivo se copió con el mismo nombre. Hay ocasiones que deseamos copiarlo con uno distinto. Para esto solo hay que especificarlo, ejecutando:

                cp mi_primer_archivo mi_primer_archivo-2 && ls
            
Copia y vista del archivo mi_primer_archivo como mi_primer_archivo-2 desde la terminal con cp y ls.
Copia y vista del archivo mi_primer_archivo como mi_primer_archivo-2 desde la terminal con cp y ls.

Semejante a las uniones de archivos con cat, cp no pregunta si deseas sobreescribir el fichero. Por ello tienes que tener cuidado en no asignar el mismo nombre de un archivo a la copia. ¡No vayas a perder datos!

Es posible copiar varios archivos en un solo comando. La vía más larga es escribir cada ruta separada por un espacio. Como bien lo estás pensando, también podemos usar el comodín (*):

                cp nivel1-c/nivel2-c/mi_* . && ls
            
Copia y vista de los archivos mi_* a borrame desde la terminal con cp y ls.
Copia y vista de los archivos mi_* a borrame desde la terminal con cp y ls.

Cabe destacar que cuando se copian varios archivos no es posible asignarles un nombre distinto, solo es posible indicar el directorio destino. Hasta ahora, la estructura que deberías de tener es:

                .├── mi_primer_archivo├── mi_primer_archivo-2├── mi_segundo_archivo.txt├── mi_tercer_archivo.txt├── nivel1-a│   └── nivel2-a├── nivel1-b└── nivel1-c └── nivel2-c ├── mi_primer_archivo ├── mi_segundo_archivo.txt └── mi_tercer_archivo.txt
            

Pero hablando de directorios, ¿probamos en copiar uno?

                cp nivel1-b nivel1-b_2
            
Intento fallido de copiar el directorio nivel1-b desde la terminal con cp.
Intento fallido de copiar el directorio nivel1-b desde la terminal con cp.

Mmm…, ¿qué ha pasado? El error nos indica que el parámetro -r no fue especificado. Esto quiere decir que no pedimos que la copia fuera recursiva.

El concepto de «recursión» puede ser muy complejo. En estos casos quiere decir que el comando cp no solo tiene que aplicarse al fichero de origen, sino también a todos los posibles elementos que contiene.

Para el caso de los archivos la recursión no es necesaria porque por definición no contienen otros ficheros adentro de ellos. Sin embargo, los directorios son ficheros que sí pueden contener más ficheros.

La analogía con las carpetas ayuda a darse cuenta que, si quieres copiarla, también tendrías que copiar todos sus elementos, ¿no es así? Es decir, necesitas indicar que el comando cp también se repita en cada uno de los posibles ficheros que están adentro de esa carpeta:

                cp -r nivel1-b nivel1-b_2 && ls
            
Copia y vista del directorio nivel1-b como nivel1-b_2 desde la terminal con cp y ls.
Copia y vista del directorio nivel1-b como nivel1-b_2 desde la terminal con cp y ls.

Con cp podemos ¡copiar y pegar al infinito y más allá!

¿Qué significa cp? Se trata de una manera corta para copy. Con este comando podemos copiar y pegar cualquier fichero desde la terminal.

9. Mr. Stark, I don't feel so good: rm

Hasta ahora tenemos un árbol como este:

                .├── mi_primer_archivo├── mi_primer_archivo-2├── mi_segundo_archivo.txt├── mi_tercer_archivo.txt├── nivel1-a│   └── nivel2-a├── nivel1-b├── nivel1-b_2└── nivel1-c └── nivel2-c ├── mi_primer_archivo ├── mi_segundo_archivo.txt └── mi_tercer_archivo.txt
            

Hay muchas copias ahí. ¡Está sobrepoblado! Así que empecemos a eliminar uno por uno de nuestros archivos:

                rm mi_primer_archivo
            

Pero esto nos puede tomar mucho tiempo. Probemos con agilizar un poco las cosas:

                rm mi_primer_archivo-2 \> mi_segundo_archivo.txt \> mi_tercer_archivo.txt && ls
            
Eliminación y vista de todos los archivos en borrame desde la terminal con rm y ls.
Eliminación y vista de todos los archivos en borrame desde la terminal con rm y ls.

Hay ocasiones donde no queremos usar el comodín (*) pero al mismo tiempo queremos tener una sintaxis más clara en lugar de escribirlo todo en una sola línea.

Bash nos permite utilizar saltos de línea para hacer nuestra redacción más legible. Estos saltos se señalan con una diagonal inversa (o barra invertida, como te agrade). Así que el pasado comando en realidad es lo mismo a rm mi_primer_archivo-2 mi_segundo_archivo.txt mi_tercer_archivo.txt && ls.10

Todavía con estos elementos la eliminación puede tardar mucho tiempo. ¿Qué tal si mejor eliminamos carpetas enteras? Para eso ejecutamos:

                rm nivel1-a
            
Intento fallido de eliminar el directorio nivel1-a desde la terminal con rm.
Intento fallido de eliminar el directorio nivel1-a desde la terminal con rm.

Algo ha fallado de nuevo… ¿No será porque el comando rm requiere de recursión, ya que se trata de una carpeta? Veamos:

                rm -r nivel1-a
            
Eliminación del directorio nivel1-a y vista de borrame desde la terminal con rm y ls.
Eliminación del directorio nivel1-a y vista de borrame desde la terminal con rm y ls.

¡Eso era! Pero aún así puede ser muy monótono eliminar carpeta por carpeta. Podemos borrar la carpeta borrame de tajo si nos vamos un nivel más arriba y le aplicamos rm. Aunque también con un chasquido de los dedos (y un comodín) podemos eliminarlas todas sin deshacernos del fichero principal:

                rm -r *
            
Eliminación de todos los ficheros adentro de borrame desde la terminal con rm.
Eliminación de todos los ficheros adentro de borrame desde la terminal con rm.

La eliminación con rm es muy rápida y poderosa… y por ende muy peligrosa. La eliminación de ficheros a través del explorador de archivos siempre los manda a la papelera. En el caso de rm, la eliminación es directa: no hay manera de recuperar los ficheros por medio de la papelera. ¡Ten cuidado!

Al fin hemos eliminado la sobrepoblación de borrame, ya podemos estar tranquilos, regresar a casa y olvidar que todo esto ha ocurrido:

                cd .. && rm -r borrame
            

¿Qué significa rm? A esta altura es fácil de adivinar: remove. Con rm podemos ser Thanos y extinguirlo todo con un par de movimientos de dedos. O casi todo… en algunas ocasiones necesitaremos forzar las cosas con -f o incluso tener permisos de administrador con sudo, no solo con rm sino con diversos comandos. Pero ¡eso es otra historia!

10. Limpiando el desorden: clear

Ya llegamos al final de este manual y la terminal te lo quiere agradecer. Me pide de favor si te puedo decir que ejecutes lo siguiente:

                while /bin/true; do echo "Gracias :)"; done
            
La terminal en una iteración infinita de agradecimiento.
La terminal en una iteración infinita de agradecimiento.

¡Ups! La terminal nos ha hecho crear un bucle infinito. Nada puede detenerlo y somos incapaces de usar la terminal… al menos que usemos ^C (Ctrl + C).

Cancelación del proceso desde la terminal con ^C.
Cancelación del proceso desde la terminal con ^C.

En varias ocasiones mientras trabajes con la terminal te encontrarás con un proceso que no puede ser finalizado. Así como en el entorno de escritorio hay programas que dejan de funcionar, en la terminal también podemos experimentarlo.

Para esas indeseadas ocasiones siempre podemos recurrir a cancelar la ejecución con ^C. No importa qué estés haciendo, Ctrl + C siempre debería de funcionar.

Esta fue una pequeña broma —ya es evidente que los chascarrillos no son tan buenos, ¿cierto?—. Pero en internet habitan muchos troles y una broma puede salirse de control, como las bombas fork. En la medida de lo posible copia y pega comandos que al menos tengas una idea general de lo que realizan.

Para limpiar el texto de la terminal, en cualquier momento puedes ejecutar:

                clear
            
Limpieza de la terminal con clear.
Limpieza de la terminal con clear.

Este comando desaparecerá lo impreso en la terminal para únicamente mostrarnos de nuevo el prompt. Úsalo cada vez que necesites un poco de orden o tengas una manía por la limpieza.

Practica, practica, practica

Este manual solo fue una breve introducción a la terminal. Varias de las cosas que aprenderás a partir de ahora de una u otra manera implicarán los comandos descritos aquí.

Esto se debe a que, al final, podemos decir que las operaciones realizadas a través de la terminal son siempre en torno a ficheros. Sea en un ambiente de escritorio o desde la terminal, en las computadoras siempre estamos creando, editando, moviendo, copiando o eliminando archivos.

Por esto, la última recomendación es que no dejes de practicar. No olvides la lógica de las rutas. Tampoco desatiendas la breve sintaxis que vimos de Bash. Siempre recuerda estos diez comandos básicos. Todo esto se pagará con creces en el futuro: un pequeño paso para ti, pero un gran paso hacia el empoderamiento tecnológico.

Mientras tanto, ¡cambio y fuera!


1 Por ejemplo: man ls. Con esto le indicarás a la terminal que te muestre el manual del comando ls. Bien puedes optar por ls --help, que te mostrará la ayuda de ls, por poner otro ejemplo. Cabe resaltar que para desplegar la ayuda, si --h no funciona, seguro --help servirá.

2 Cygwin no cuenta con nano preinstalado, por lo que se tiene que instalar desde su gestor de paquetes.

3 El directorio home de Cygwin puede no ser el mismo al home de Windows. Depende de la configuración realizada al instalarlo. Si no puedes encontrar el home de Cygwin, con probabilidad se encontrará en el disco local C. De ahí busca la instalación de Cygwin.

4 Existe un comando más ilustrativo llamado tree. Si lo tienes instalado puedes ejecutar tree borrame para que veas una vista en árbol del fichero borrame. ¿Más cómodo, cierto?

5 ¿Sabías que por pereza no hay necesidad de escribirlo todo? Si usas la tecla Tab es posible autocompletar las palabras. Así tendrás un uso más ágil de la terminal y es muy útil para saber hacia dónde estás retrocediendo.

6 El editor nano es de los más recientes. En la tradición linuxera existen otros editores con más peso como vim o GNU Emacs. Pero este manual es básico, así que empleamos nano por ser el más sencillo.

7 Por convención la tecla Ctrl se simboliza con ^. Así, ^X es igual a Ctrl + X.

8 ¿Sabías que el formato ODT es el archivo abierto para los documentos de texto procesado? Aunque el DOCX o el DOC han dominado el panorama, The Document Foundation vela por la implementación de estándares abiertos para la paquetería de oficina y ODT es uno de sus formatos.

9 El ejemplo usa exclusivamente cat, pero el operador > puede usarse para cualquier comando.

10 Al hacer saltos de línea con \, el símbolo > lo agrega Bash de manera automática.