Comandos para la terminal
Tags: terminal, beginners, cheatsheet
Published: 2023-04-22 20:26:49

## ¿Qué es la terminal?
Interfaz gráfica que simula una línea de comandos, es decir, una shell. La terminal es una ventana en donde está el prompt. La línea de comandos (shell) es quien toma los comandos y los manda al sistema operativo para hacer algo.

Tipos de shells:
- Boune shell
- Bash shell
- PowerShell
- Z Shell
- C Shell
- Korn Shell
- Fish Shell

En la terminal encontrarás lo siguiente:
nombreDeUsuario@nombreDelEquipo:directorio$

Podemos usar estos atajos: 
`Ctrl + C` Mata el proceso actual
`Ctrl + L` Limpia la pantalla

### Definiciones
**Comando** Un comando puede ser un programa ejecutable, un comando de utilidad de la shell, una función del shell o un alias.
**Wildcards** Son caracteres especiales (?, *) que permiten encontrar patrones o realizar búsquedas en al menos dos niveles.

## Comandos básicos
`clear` Limpia la pantalla (Ctrl + L)
`cd ruta` Cambia el directorio actual
`cd ..` Regresa al directorio anterior
`pwd` Devuelve la ruta en donde estamos
`echo "Hello world"` Imprime el texto que escribamos
`cat archivo.extension` Muestra el contenido del archivo
`cat archivo1.ext archivo2.ext` Muestra el contenido de ambos archivos
`file archivo.md` Devuelve la información del archivo
`tree` Despliega todos los archivos existentes
`tree -L 2` Limita los niveles de ramas a 2
`type comando` Devuelve el tipo de comando que es
`alias nombre="comando"` Crea un alias para un comando, son temporales si no se guardan
`help comando` Muestra la ayuda para ese comando
`comando --help` Muestra la ayuda para ese comando
`man comando` Muestra el manual de usuario del comando especificado
`info comando` Muestra la información del comando (es más legible que 'man')
`whatis comando` Devuelve la descripción de qué hace un comando, no funciona con todos los comandos
`whoami` Muestra quien somos en el sistema operativo
`id` Da información sobre el usuario
`cal` Muestra un calendario
`date` Muestra la fecha y hora del sistema operativo
`printenv` Muestra todas las variables de entorno configuradas
`echo $HOME` Imprime el valor de esa variable de entorno 
`jobs` Muestra los procesos que están en segundo plano y su número de trabajo
`fg 1` Saca el proceso que tenga el número de trabajo '1' del segundo plano y lo trae a primer plano (la terminal)

`su root` Cambia al usuario root
`sudo comando` Ejecuta el comando con el usuario root
`passwd` Para cambiar la contraseña 

`mkdir Directorio` Crea un directorio (pueden crearse varios al mismo tiempo)
`touch archivo.extension` Crea un archivo (pueden crearse varios al mismo tiempo)

`cp archivoACopiar Ruta/NombreNuevoArchivo` Copia un archivo
`mv archivoAMover Ruta` Mueve el archivo a la ruta donde especifiquemos
`mv nombreAnterior nombreNuevo` Cambia el nombre del archivo/directorio

`rm archivo` Elimina un archivo
`rm -i archivo` Elimina un archivo, pero antes solicita confirmación (i = interactive)
`rm -r directorio` Elimina un directorio (r = recursive)
`rm -f archivo` Fuerza la eliminación de un archivo/directorio

`head archivo` Muestra las primeras 10 líneas del archivo
`head archivo -n 15` Muestra las primeras 15 líneas del archivo
`tail archivo` Muestra las últimas 10 líneas del archivo
`tail archivo -n 12` Muestra las últimas 12 líneas del archivo
`less archivo` Muestra el archivo completo, interactivo. Con `/` podemos buscar palabras y con `q` salimos.
`open archivo` Abre un archivo como normalmente se haría (MAC)
`xdg-open archivo` Abre el archivo (Linux)

### Archivos
`ls` Lista los archivos y directorios del directorio donde te encuentras
`ls -d` Lista los directorios
`ls -l` Lista los archivos con detalles (l = long)
`ls -lh` Lista los archivos mostrando los detalles más legibles (h = human)
`ls -la` Lista los archivos ocultos
`ls -ls` Lista los archivos por tamaño (s = size)
`ls -lr` Lista los archivos de Z-A (r = reverse)
`ls -s ruta nombreLink` Crea un link simbólico, para no escribir toda la ruta, solo escribimos su nombre

**Wildcards**
`ls *.txt` Lista todos los archivos que terminen en '.txt'
`ls a*` Lista todo lo que inicie con 'a'
`ls a?` Lista todo lo que inicie con 'a' y tenga solo un carácter después (pueden agregarse múltiples '?')
`ls [[:uppercase:]]*` Lista lo que inicie con mayúscula y tenga más caracteres después
`ls -d [[:uppercase:]]*` Lista los directorios que inicien con mayúscula y tengan más caracteres después
`ls [[:lower:]]*` Lista lo que inicie con minúscula
`ls [ad]*` Lista lo que inicie con 'a' o 'd' y tenga más caracteres después

### Comandos de búsqueda
`which comando` Ayuda a encontrar la ruta de los binarios del comando
`find ruta -name archivo` Busca 'archivo' y empieza a buscar en 'ruta'
`find ruta -type d -name directorio` Busca un directorio (d) de nombre 'directorio', para buscar archivo es `-type f`
`find ruta -size 20M` Busca los archivos que pesen 20MB

`grep palabra archivo.ext` Busca 'palabra' dentro de 'archivo.ext'
`grep -i palabra archivo.ext` Busca 'palabra' en 'archivo.ext' ignorando mayúsculas/minúsculas
`grep -c palabra archivo.ext` Cuenta las veces que aparece 'palabra'
`grep -vi palabra archivo.ext` Muestra lo que no tenga 'palabra'
`wc archivo.ext` Muestra cuántas líneas tiene el archivo, cuántos caracteres, número de bits y el nombre del archivo
`wc -l archivo` Devuelve el número de líneas del archivo
`wc -w archivo` Devuelve el número de palabras del archivo
`wc -c archivo` Devuelve el número de bits del archivo

### Utilidades de red
`ifconfig` Muestra información de red
`ping url` Conecta con la URL proporcionada para ver si está activa
`curl url` Trae un archivo desde esa URL, por ejemplo, el HTML
`wget url` Parecido a 'curl', descarga algo desde la red
`traceroute url` Muestra si hay algún servidor fallando para llegar de nuestra computadora a la URL
`netstat -i` Muestra los dispositivos e información de la red

### Comprimir archivos
`tar -cvf comprimido.tar aComprimir` Comprime el archivo en .tar, mostrando que va comprimiendo (c = compress, v = verbose, f = file)
`tar -cvfz comprimido.tar.gz comprimido.tar` Comprime el archivo en gzip (z = gzip)
`tar -vfzx comprimido.tar.gz` Descomprime el archivo
`zip -r comprimido.zip comprimir` Comprime en .zip
`unzip comprimido.zip` Descomprime el archivo zip

### Manejo de procesos
`ps` Muestra los procesos/comandos que se estén ejecutando actualmente con su PID
`kill PID` Mata el proceso dado el PID
`top` Muestra los procesos que usan más recursos

### Editor de texto en la terminal
`sudo apt install vim` Instala vim (vi es el editor antiguo, vim = vi moderno)
`vim` Abre una pantalla para crear archivos de texto
`vim archivo.ext` Crea 'archivo.ext' para editarlo

### Pipe: Combinar comandos
`ls -lh | less` Lista los archivos de forma interactiva
`ls -lh | less | tee archivo.ext` 'Tee' hace que el resultado se guarde en 'archivo.ext'. El resultado es la lista de archivos de forma interactiva.
`ls -lh  | tee archivo.ext | less` Primero guarda la salida y luego muestra la salida con 'less'
`ls directorio | sort` Muestra la salida de A-Z

### Encadenar comandos
Ejecutar comandos de modo síncrono (uno detrás de otro)
`ls; mkdir directorio; cal` Separa comandos con ';', primero lista los archivos, después crea un directorio y finalmente muestra un calendario.
Ejecutar comandos de modo asíncrono (por cada comando se abre otra shell en segundo plano)
`ls & date & cal` Muestra en que número de proceso (PID) se ejecutó el comando y muestra las salidas

### Ejecutar comandos de manera condicional
**AND**
`mkdir directorio && cd directorio` Si se puede, crea 'directorio' y va a la carpeta
**OR**
`cd ruta || touch archivo` Si 'ruta' existe, accede, si no existe, crea 'archivo'
`cd ruta || touch archivo || echo "Hola"` Si 'ruta' existe, accede, sino, crea 'archivo', si el archivo se crea, el proceso finaliza, sino, ejecuta el 'echo'

### Permisos
#### Estructura de un permiso
`-rw-r--r--` 
El primer caracter es el tipo de archivo (-)
Los siguientes 3 caracteres son los permisos para el usuario (rw-)
Los siguientes 3 caracteres son los permisos para grupos (r--)
Los siguientes 3 caracteres son los permisos para otros (r--)

#### Tipo de archivo
`-` Un archivo normal
`d` Directorios
`l` Un link simbólico (acceso directo desde la terminal)
`d` Un archivo de bloque especial (guarda información de un dispositivo (USB, HDD) normalmente)

#### Tipo de modo
Permisos:
r = read = Permiso de ver el contenido del archivo
w = write = Permiso de editar el contenido del archivo
x = execute = Permiso para ejecutar el contenido del archivo
Los permisos activos tienen '1'

**Modo dueño** (quien creó el archivo, tiene archivo de leer, escribir y ejecutar)
r w x
1 1 1
**Modo grupo** (para archivos compartidos, tiene permiso de leer y ejecutar)
r w x
1 0 1
**Modo world** (otros, tiene permiso de leer y ejecutar)
r w x
1 0 1
**Modo simbólico**
`u` Permiso solo para el usuario
`g` Permiso solo para el grupo
`o` Permiso solo para otros (ni usuario ni grupo)
`a` permiso para todos

#### Modificar permisos en la terminal
**Definir permisos en diferentes modos**
r w x
1 1 1     - Boleano
4 2 1     - Binario
4 2 1 = 7 - Octal

Es decir, para asignar todos el permiso 'rx' sería:
r w x
1 0 1     - Boleano
4 0 1     - Binario
4 0 1 = 5 - Octal

Para asignar todos el permiso 'r' sería:
r w x
1 0 0     - Boleano
4 0 0     - Binario
4 0 0 = 4 - Octal

`chmod 755 archivo` Cambia los permisos de 'archivo', está en octal, Da todos los permisos al usuario, y 'rx' para grupos y otros.
`chmod u-r archivo` Quita el permiso de lectura (r) al usuario (u)
`chmod u+r archivo` Da el permiso de lectura (r) al usuario (u)
`chmod u-x,go=w archivo` Quita al usuario el permiso de ejecución (x) y a grupo y otros (go) solo les da el permiso de escritura (w)

## Juego
`sudo apt install cowsay` Muestra un mensaje con una vaca
`sudo apt install lolcat` Cambia de color cualquier texto
`cowsay -l` Muestra los dibujos disponibles, se debe poner -f
`cowsay "Hola"` Devuelve una vaca diciendo 'Hola'
`lolcat "Hola"` Muestra 'Hola' de diferente color
``cowsay "Hola" | lolcat` Devuelve una vaca colorida diciendo 'Hola'
`cowsay -f dragon-and-cow "Hola" | lolcat` Devuelve un dragón con una vaca,  coloridos, diciendo 'Hola'
`cowsay -f dragon-and-cow "Hola" | lolcat -F 12 -d 5 -a` Anima el resultado