De qué va. La terminal de Linux es la herramienta más potente que vas a usar en tu carrera. Si dominas estos comandos, dominas el sistema. En esta sesión vas a manejar la terminal de Ubuntu: navegación, manipulación de archivos, comodines, redirección, tuberías, búsquedas con find y grep, compresión y edición.
Por qué importa. En un servidor real (web, base de datos, red) no hay escritorio gráfico. Solo terminal por SSH. Si no sabes moverte ahí, no puedes administrar nada.
Cómo se entrega. Pega capturas con Ctrl+V, arrastra o selecciona. Autosave en este navegador. ⬇ Exportar al terminar.
1 Anatomía del prompt y navegación
Diseccionar el prompt
Cuando abres una terminal, lo primero que ves es algo así:
juan@portatil:~$
Léelo de izquierda a derecha:
- juan — tu usuario.
- @ — separador.
- portatil — el hostname (nombre del equipo).
- : — separador.
- ~ — directorio actual (la virgulilla = /home/juan).
- $ — usuario normal. Si fuera #, serías root.
whoami # ¿quién soy? hostname # ¿en qué máquina estoy? pwd # ¿dónde estoy? id # UID, GID y grupos date # fecha y hora uptime # tiempo encendido y carga uname -a # kernel y arquitectura
| Comando | Tu salida |
|---|---|
| whoami | |
| id (UID que aparece) | |
| uname -a (versión del kernel) | |
| uptime (carga media) |
Navegación
cd /etc # ir a /etc (absoluta) pwd # confirma dónde estás cd # sin argumento te lleva a ~ cd /var/log cd - # vuelve a la carpeta anterior cd ../.. # sube dos niveles cd ~juan # va a la home de otro usuario (si existe)
Vas a usar dos comandos encadenados con && (significa «si el primero funciona, ejecuta el segundo»). El primero cambia de carpeta a /etc. El segundo lista lo que hay (ls) y pasa esa lista por una «tubería» | al comando wc -l, que cuenta líneas.
cd /etc && ls | wc -l
El número que te devuelve es la cantidad de archivos y carpetas que hay directamente dentro de /etc. Anótalo:
2 Listado, creación y manipulación
Variantes de ls
ls # simple ls -l # largo, con permisos, tamaño, fecha ls -la # incluye ocultos ls -lh # tamaños humanos (K, M, G) ls -lhS # ordenado por tamaño (S=size) ls -lhrt # más reciente al final (r reverse, t time) ls -laR /etc/network # recursivo
Tu carpeta personal es /home/tu_usuario. Para ir ahí: cd ~ (la virgulilla es un atajo de tu home).
Ahora lista todo lo que hay, incluidos los ocultos (los que empiezan por punto). Para eso usa ls -la. Verás algo así:
total 124 drwxr-x--- 18 juan juan 4096 may 26 10:00 . drwxr-xr-x 3 root root 4096 may 20 09:00 .. -rw------- 1 juan juan 220 may 20 09:00 .bash_history -rw-r--r-- 1 juan juan 3771 may 20 09:00 .bashrc drwx------ 3 juan juan 4096 may 21 11:00 .cache ...
Fíjate en 3 líneas «especiales» que NO son archivos tuyos: la primera (total 124) es solo un resumen, y las entradas . y .. son atajos al directorio actual y al padre (no son archivos reales).
Para contarlos de forma rápida:
ls -la ~ | wc -l
wc -l cuenta cuántas líneas tiene la salida. Réstale 3 (las 3 líneas especiales de arriba) y tendrás cuántos archivos/carpetas ocultos tienes realmente.
Reto de creación
Vas a crear esta estructura en ~/Reto_Linux:
~/Reto_Linux/
├── docs/
│ ├── 2024/
│ ├── 2025/
│ └── 2026/
├── scripts/
│ ├── activos/
│ └── archivados/
├── logs/
└── .config_oculto/
└── settings.conf
mkdir -p ~/Reto_Linux/{docs/{2024,2025,2026},scripts/{activos,archivados},logs,.config_oculto}
touch ~/Reto_Linux/.config_oculto/settings.conf
tree ~/Reto_Linux -a # si no tienes tree: sudo apt install tree
Rellenar con archivos
cd ~/Reto_Linux # crear varios archivos con touch touch docs/2024/{enero,febrero,marzo}.txt touch docs/2025/{enero,febrero,marzo,abril,mayo}.txt touch docs/2026/{enero,febrero}.txt # archivo con contenido usando echo y redirección echo "Mi primer script" > scripts/activos/hola.sh echo "echo Hola mundo" >> scripts/activos/hola.sh cat scripts/activos/hola.sh # varios archivos de log de relleno for i in {1..10}; do echo "log $i" > logs/sistema_$i.log; done ls -lh logs/
cp y mv
cp scripts/activos/hola.sh scripts/activos/hola_copia.sh cp -r docs docs_backup # carpetas necesitan -r mv docs_backup docs_archivo # renombrar mv logs/sistema_1.log logs/old_1.log # mover/renombrar archivo ls logs/
Borrado
# un archivo rm logs/old_1.log # varios rm logs/sistema_{8,9,10}.log # carpeta entera (CUIDADO) rm -r docs_archivo # si quieres confirmación archivo por archivo rm -i scripts/activos/hola_copia.sh
3 Comodines y expansión
| Comodín | Significado | Ejemplo |
|---|---|---|
| * | Cualquier cantidad de caracteres | ls *.txt |
| ? | Un único carácter | ls foto?.jpg |
| [abc] | Cualquiera de esos | ls foto[12].jpg |
| [a-z] | Rango | ls *[0-9].txt |
| {a,b,c} | Varias opciones | ls *.{txt,md,log} |
cd ~/Reto_Linux/docs/2025 ls *.txt # todos los .txt ls ?nero.txt # un solo carácter al inicio ls [ef]*.txt # empiezan por e o f ls /etc/*.conf | head # confs en /etc, primeros 10 ls /etc/{passwd,group,shadow} # archivos concretos
4 Redirección y tuberías
| Símbolo | Qué hace |
|---|---|
| > | Redirige salida a un archivo (sobrescribe) |
| >> | Añade al final del archivo |
| < | Lee la entrada desde un archivo |
| | | Pasa la salida de un comando como entrada al siguiente |
| 2> | Redirige solo los errores |
| 2>&1 | Funde errores con la salida normal |
| /dev/null | «Agujero negro»: lo que se redirige ahí se descarta |
cd ~/Reto_Linux # Listar /etc y guardar a archivo ls /etc > lista_etc.txt wc -l lista_etc.txt # Añadir la fecha al final del archivo date >> lista_etc.txt tail lista_etc.txt # Pipeline: contar archivos .conf en /etc ls /etc | grep "\.conf$" | wc -l # Top 5 procesos por uso de memoria ps aux --sort=-%mem | head -6 # Errores van por separado: forzar uno y redirigirlo ls /noexiste 2> errores.log cat errores.log # Descartar errores find / -name "*.conf" 2> /dev/null | head
Vas a encadenar 3 comandos con tuberías:
- du -sh ~/*/ mide el tamaño de cada carpeta de tu home (la s es «summary» y la h es «human» — tamaños en K/M/G).
- sort -hr ordena por tamaño humano (h), de mayor a menor (r=reverse).
- head se queda con las 10 primeras líneas.
du -sh ~/*/ | sort -hr | head
Ejecútalo y pega la salida (o anota las 3 más grandes):
5 Buscar archivos con find y texto con grep
find: el buscador todoterreno
# sintaxis: find <dónde> <criterio> <acción> find /etc -name "*.conf" # por nombre find /etc -iname "*RESOLV*" # sin distinguir mayúsculas find / -size +100M 2>/dev/null # por tamaño > 100 MB find ~ -mtime -1 # modificados hace menos de 1 día find ~ -mtime +30 # modificados hace más de 30 días find ~ -type f -name "*.log" # solo archivos (no carpetas) find ~ -type d -name "scripts" # solo directorios find ~/Reto_Linux -empty # vacíos # find + acción: borrar todos los .tmp find /tmp -name "*.tmp" -delete # find + exec: ejecutar comando sobre cada resultado find ~/Reto_Linux/logs -name "*.log" -exec wc -l {} \;
Combina find (busca por nombre en todas las subcarpetas) con wc -l (cuenta líneas):
find /etc -name "*.conf" | wc -l
Anota el número:
La opción -mtime -1 de find significa «modificado hace MENOS de 1 día». El signo menos es importante (sin él busca exactamente hace 1 día).
find ~ -mtime -1 -type f
Para contar cuántos son, añade | wc -l al final. Anota el comando exacto que usaste y el número:
grep: buscar dentro de archivos
grep "root" /etc/passwd # líneas con "root" grep -i "INTERFACE" /etc/network/interfaces 2>/dev/null # sin mayúsculas grep -n "bash" /etc/passwd # con número de línea grep -c "bash" /etc/passwd # contar coincidencias grep -v "#" /etc/ssh/sshd_config 2>/dev/null | grep -v "^$" # sin comentarios ni vacías grep -r "ubuntu" /etc 2>/dev/null # recursivo grep -E "^(root|nobody):" /etc/passwd # regex extendida
El archivo /etc/passwd tiene una línea por cada usuario del sistema. La última columna (separada por :) es el shell que se abre al iniciar sesión. Si pone /bin/bash, es un usuario «normal» que puede usar la terminal. Si pone /usr/sbin/nologin o /bin/false, es una cuenta de sistema que no se usa para login.
Cuenta las líneas que contienen «bash»:
grep -c bash /etc/passwd
(La -c es «count», cuenta coincidencias.) Anota el número:
Son los que tienen /usr/sbin/nologin o /bin/false como shell. Para listarlos puedes usar grep con la opción -E (regex extendida) y el operador | dentro de las comillas (que aquí significa «o»):
grep -E "nologin|false" /etc/passwd
Pega aquí 3 ejemplos de cuentas de sistema que veas (la primera columna es el nombre):
6 Compresión: tar, gzip, zip
tar — el estándar en Linux
Memotécnico para las opciones más comunes:
| Letra | Significa |
|---|---|
| c | Create (crear) |
| x | eXtract (extraer) |
| t | lisT (listar sin extraer) |
| v | Verbose (ver qué hace) |
| f | File (siempre antes del nombre del archivo) |
| z | gZip (comprime/descomprime con gzip) |
| j | bzip2 (más compresión, más lento) |
| J | xz (todavía más compresión) |
cd ~ # Crear tar.gz de Reto_Linux tar -czvf reto.tar.gz Reto_Linux/ # Listar sin extraer tar -tzvf reto.tar.gz | head # Tamaño comparativo du -sh Reto_Linux/ reto.tar.gz # Probar bzip2 y xz tar -cjvf reto.tar.bz2 Reto_Linux/ tar -cJvf reto.tar.xz Reto_Linux/ ls -lh reto.tar.* # Extraer en otra carpeta mkdir -p ~/Destino tar -xzvf reto.tar.gz -C ~/Destino/ ls ~/Destino/
| Archivo | Tamaño |
|---|---|
| Reto_Linux/ (sin comprimir) | |
| reto.tar.gz | |
| reto.tar.bz2 | |
| reto.tar.xz |
zip — compatible con Windows
sudo apt install -y zip unzip # si no están
zip -r reto.zip Reto_Linux/
unzip -l reto.zip | head
unzip reto.zip -d ~/Destino_zip/
7 Editores en consola: nano y vim básico
nano — fácil
nano ~/Reto_Linux/notas.txt # Escribe varias líneas # Ctrl+O guardar (write Out) # Ctrl+X salir # Ctrl+K cortar línea # Ctrl+U pegar # Ctrl+W buscar (Where) # Ctrl+_ ir a número de línea
vim — el ninja
Vim tiene modos. Esa es la clave que confunde a todo el mundo al principio:
- Modo normal (al entrar): teclas para moverte y dar órdenes. Aquí no escribes texto.
- Modo insertar (pulsando i): aquí sí escribes texto, como en cualquier editor.
- Modo comando (pulsando : desde normal): para guardar, salir, buscar.
Para volver a normal desde cualquier sitio: Esc.
vim ~/Reto_Linux/vim_tour.txt # Pulsa i para entrar en modo insertar # Escribe: "Hola desde vim" # Pulsa Esc # Escribe :w para guardar # Escribe :q para salir # O en una sola: :wq # Si quieres salir sin guardar: :q!
8 Reto final · Pipeline real
cd ~/Reto_Linux/logs for i in $(seq 1 50); do echo "$(date) - evento $i" > "log_$(printf '%03d' $i).log" done ls -la | head
# Los 25 primeros con fecha de hace 60 días
for i in $(seq 1 25); do
touch -d "60 days ago" "log_$(printf '%03d' $i).log"
done
ls -lt | head -30
find . -name "log_*.log" -mtime +30 -delete
ls | wc -l # ¿cuántos quedan?
cd ~/Reto_Linux
{
echo "=== INFORME DEL SISTEMA ==="
echo "Fecha: $(date)"
echo "Usuario: $(whoami)"
echo "Hostname: $(hostname)"
echo ""
echo "=== KERNEL ==="
uname -a
echo ""
echo "=== MEMORIA ==="
free -h
echo ""
echo "=== DISCO ==="
df -h /
echo ""
echo "=== TOP 5 PROCESOS POR RAM ==="
ps aux --sort=-%mem | head -6
echo ""
echo "=== ARCHIVOS DE LOG RESTANTES ==="
ls logs/ | wc -l
} > informe_$(date +%Y%m%d).txt
cat informe_*.txt
tar -czvf entrega_$(whoami)_$(date +%Y%m%d).tar.gz \ Reto_Linux/informe_*.txt \ Reto_Linux/logs/ \ Reto_Linux/scripts/ ls -lh entrega_*.tar.gz
✓ Autoevaluación final
Marca lo que has completado.