La terminal es la herramienta más potente que tiene un programador. No importa si trabajas en frontend, backend, datos o sistemas: en algún momento vas a necesitar navegar por directorios, mover archivos, buscar texto en código, gestionar procesos o conectarte a un servidor remoto. Los desarrolladores que dominan la terminal trabajan más rápido, entienden mejor lo que ocurre en sus sistemas y resuelven problemas que a otros les llevan horas.
Esta guía cubre los comandos esenciales organizados por categorías, con ejemplos reales y los casos de uso más frecuentes del día a día de un programador.
Navegación y exploración de directorios
Lo primero que necesitas saber es moverte por el sistema de archivos sin depender del explorador gráfico.
# pwd — Print Working Directory: muestra dónde estás ahora mismo
pwd
# /home/ana/proyectos/mi-app
# ls — listar el contenido del directorio actual
ls
# carpeta1 carpeta2 archivo.txt README.md
# ls con opciones (las más útiles)
ls -l # formato largo: permisos, tamaño, fecha, dueño
ls -la # igual que -l pero incluye archivos ocultos (los que empiezan por .)
ls -lh # tamaños en formato legible (KB, MB, GB en lugar de bytes)
ls -lt # ordenado por fecha de modificación, el más reciente primero
ls -lS # ordenado por tamaño, el más grande primero
# Ejemplo de salida de ls -lh
# drwxr-xr-x 5 ana staff 160B 15 Jun 10:30 src
# -rw-r--r-- 1 ana staff 4.2K 14 Jun 09:15 README.md
# -rwxr-xr-x 1 ana staff 1.1K 13 Jun 18:42 script.sh
# cd — Change Directory: cambiar de directorio
cd proyectos # entra en la carpeta proyectos
cd mi-app/src # entra en src dentro de mi-app
cd .. # sube un nivel (al directorio padre)
cd ../.. # sube dos niveles
cd ~ # va al directorio home del usuario
cd - # vuelve al directorio anterior (muy útil)
cd /var/log # ruta absoluta desde la raíz
# Truco: cd sin argumentos también va al home
cd
# tree — muestra la estructura de directorios en árbol
tree # árbol completo (puede ser enorme)
tree -L 2 # solo 2 niveles de profundidad
tree -L 2 --dirsfirst # carpetas primero
tree -I "node_modules|.git|__pycache__" # excluir carpetasCrear, copiar, mover y eliminar archivos
# mkdir — crear directorios
mkdir nueva-carpeta
mkdir src/components # crea components dentro de src (src debe existir)
mkdir -p src/components/ui # crea toda la ruta aunque no exista ningún nivel
mkdir -p proyecto/{src,tests,docs} # crea varias carpetas a la vez con expansión de llaves
# touch — crear archivos vacíos (o actualizar la fecha de un archivo existente)
touch index.js
touch src/utils.py
touch .env .gitignore README.md # varios archivos a la vez
# cp — copiar archivos y directorios
cp archivo.txt copia.txt # copia un archivo
cp archivo.txt directorio/ # copia a un directorio
cp -r carpeta/ destino/ # copia un directorio completo (-r = recursivo)
cp -rp carpeta/ destino/ # copia conservando permisos y fechas
# mv — mover o renombrar
mv archivo.txt nuevo-nombre.txt # renombrar un archivo
mv archivo.txt carpeta/ # mover a otra carpeta
mv carpeta-vieja/ carpeta-nueva/ # renombrar una carpeta
mv *.js src/ # mover todos los .js a src/
# rm — eliminar (¡cuidado! no hay papelera de reciclaje)
rm archivo.txt # eliminar un archivo
rm archivo1.txt archivo2.txt # eliminar varios
rm -r carpeta/ # eliminar una carpeta y todo su contenido
rm -rf carpeta/ # forzar sin confirmación (úsalo con extremo cuidado)
rm *.log # eliminar todos los archivos .log
# NUNCA ejecutes esto:
# rm -rf / → borraría todo el sistema
# rm -rf ~/ → borraría todo tu home
# rm -rf ./ → borraría todo el directorio actualVer y editar contenido de archivos
# cat — mostrar el contenido completo de un archivo
cat README.md
cat package.json
cat archivo1.txt archivo2.txt # concatenar y mostrar dos archivos
# less — ver archivos largos con paginación (el más útil)
less error.log
# Dentro de less:
# Espacio / f → página siguiente
# b → página anterior
# g → ir al inicio
# G → ir al final
# /texto → buscar "texto"
# n → siguiente ocurrencia
# q → salir
# head y tail — ver el inicio o el final de un archivo
head archivo.log # primeras 10 líneas (por defecto)
head -n 20 archivo.log # primeras 20 líneas
tail archivo.log # últimas 10 líneas
tail -n 50 archivo.log # últimas 50 líneas
tail -f servidor.log # sigue el archivo en tiempo real (para logs)
tail -f logs/*.log # seguir múltiples archivos de log a la vez
# wc — contar palabras, líneas y caracteres
wc -l archivo.txt # número de líneas
wc -w archivo.txt # número de palabras
wc -c archivo.txt # número de bytes
# Contar líneas de código en el proyecto (excluyendo node_modules)
find . -name "*.js" -not -path "*/node_modules/*" | xargs wc -l | tail -1
# diff — comparar dos archivos línea a línea
diff archivo1.txt archivo2.txt
diff -u archivo-viejo.js archivo-nuevo.js # formato unificado (como git diff)Buscar archivos y texto
Saber buscar eficientemente en el sistema de archivos y dentro del código es una habilidad que marca la diferencia.
# find — buscar archivos y directorios
find . -name "*.py" # todos los .py en el directorio actual
find . -name "*.log" -not -path "*/node_modules/*"
find /var/log -name "*.log" -mtime -1 # modificados en las últimas 24h
find . -type f -size +1M # archivos mayores de 1 MB
find . -type d -name "__pycache__" # directorios llamados __pycache__
find . -name "*.tmp" -delete # encontrar y eliminar archivos .tmp
find . -type f -newer referencia.txt # archivos más nuevos que referencia.txt
# Ejecutar un comando sobre cada resultado de find
find . -name "*.py" -exec python -m py_compile {} \;
find . -name "*.png" -exec ls -lh {} \;
# grep — buscar texto dentro de archivos (el más usado del día a día)
grep "TODO" archivo.js # busca "TODO" en un archivo
grep -r "TODO" src/ # busca recursivamente en una carpeta
grep -ri "error" logs/ # recursivo + insensible a mayúsculas
grep -rn "console.log" src/ # con número de línea
grep -rl "import React" src/ # solo los nombres de archivos que coinciden
grep -v "comentario" archivo.js # líneas que NO contienen "comentario"
grep -c "error" servidor.log # cuenta cuántas líneas contienen "error"
# grep con expresiones regulares
grep -E "^(import|require)" index.js # líneas que empiezan con import o require
grep -E "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}" access.log # buscar IPs en un log
# Combinar find y grep para búsquedas potentes
grep -r "database" . --include="*.py" # buscar en archivos .py solamente
grep -rn "TODO\|FIXME\|HACK" src/ # buscar varios patrones a la vez
# Caso de uso real: encontrar todos los console.log en el proyecto
grep -rn "console\.log" src/ --include="*.js" --include="*.ts"Redireccionamiento y tuberías (pipes)
Las tuberías son lo que hace a la terminal verdaderamente potente: encadenar comandos para resolver problemas complejos con una sola línea.
# | (pipe) — pasa la salida de un comando como entrada del siguiente
ls -l | grep ".js" # listar solo archivos .js
cat server.log | grep "ERROR" # filtrar errores de un log
ps aux | grep "node" # buscar procesos de Node.js
# > — redirigir la salida a un archivo (sobreescribe)
ls -la > lista_archivos.txt
echo "Hola mundo" > saludo.txt
python script.py > salida.log 2>&1 # redirigir stdout Y stderr al mismo archivo
# >> — añadir la salida al final de un archivo (no sobreescribe)
echo "nueva línea" >> saludo.txt
date >> registro.log
# < — usar un archivo como entrada
sort < lista_desordenada.txt
mysql -u root -p base_de_datos < volcado.sql # importar SQL desde archivo
# Combinaciones útiles del día a día
cat error.log | grep "Exception" | sort | uniq -c | sort -rn
# Lee el log → filtra excepciones → ordena → cuenta duplicados → muestra por frecuencia
ls -la | awk '{print $5, $9}' | sort -rn | head -10
# Lista archivos → extrae tamaño y nombre → ordena por tamaño → muestra los 10 más grandes
history | grep "git" | tail -20
# Ver los últimos 20 comandos git que ejecutasteGestión de procesos
# ps — listar procesos en ejecución
ps aux # todos los procesos del sistema
ps aux | grep "python" # filtrar procesos de Python
ps aux | grep "node" # procesos de Node.js
# top / htop — monitor de procesos en tiempo real
top # vista básica (viene en todos los sistemas)
htop # versión mejorada y visual (instalar aparte)
# En top: q para salir, k para matar proceso, r para cambiar prioridad
# kill — terminar procesos
kill 1234 # termina el proceso con PID 1234 (señal SIGTERM)
kill -9 1234 # fuerza la terminación inmediata (SIGKILL)
killall node # termina todos los procesos llamados "node"
pkill -f "python script.py" # termina procesos por nombre completo del comando
# Cómo matar un proceso que ocupa un puerto
# Encontrar qué proceso usa el puerto 3000
lsof -i :3000
netstat -tlnp | grep :3000 # alternativa
# Matar directamente el proceso que usa el puerto 3000
lsof -ti :3000 | xargs kill -9
# Ejecutar procesos en segundo plano
node servidor.js & # el & lo lanza en background
jobs # listar procesos en background
fg # traer el último proceso a foreground
fg %2 # traer el proceso número 2
bg # reanudar en background un proceso pausado
# nohup — ejecutar sin que se detenga al cerrar la terminal
nohup python servidor.py > logs/servidor.log 2>&1 &
# El proceso sigue aunque cierres la sesión SSHVariables de entorno y configuración
# Mostrar todas las variables de entorno del sistema
env
printenv
# Mostrar el valor de una variable específica
echo $HOME # /home/ana
echo $PATH # rutas donde el sistema busca ejecutables
echo $USER # nombre del usuario actual
echo $SHELL # shell que estás usando (/bin/bash, /bin/zsh)
echo $PWD # directorio actual (igual que pwd)
# Definir una variable de entorno para la sesión actual
export API_KEY="mi_clave_secreta"
export NODE_ENV="development"
export PORT=3000
# Verificar que se definió
echo $API_KEY # mi_clave_secreta
# Definir variable solo para un comando específico (no afecta al entorno)
PORT=4000 node servidor.js
NODE_ENV=test npm test
# Cargar variables desde un archivo .env (con dotenv CLI)
# npm install -g dotenv-cli
dotenv -e .env -- node servidor.js
# Variables persistentes: añadir al archivo de configuración del shell
# Para bash: ~/.bashrc o ~/.bash_profile
# Para zsh: ~/.zshrc
echo 'export API_KEY="mi_clave"' >> ~/.zshrc
source ~/.zshrc # recargar la configuración sin reiniciar la terminal
# which — encontrar dónde está instalado un comando
which node # /usr/local/bin/node
which python3 # /usr/bin/python3
which git # /usr/bin/gitPermisos de archivos
# chmod — cambiar permisos de archivos
# Formato octal:
# 4 = lectura (r)
# 2 = escritura (w)
# 1 = ejecución (x)
# Los tres dígitos son: propietario / grupo / otros
chmod 755 script.sh # rwxr-xr-x: el dueño puede todo, otros solo leer y ejecutar
chmod 644 config.txt # rw-r--r--: el dueño lee/escribe, otros solo leen
chmod 600 .env # rw-------: solo el dueño puede leer y escribir (¡ideal para .env!)
chmod 777 archivo.sh # rwxrwxrwx: todos pueden todo (evitar en producción)
chmod +x script.sh # añadir permiso de ejecución a todos
chmod -x script.sh # quitar permiso de ejecución
chmod -R 755 carpeta/ # aplicar recursivamente a toda la carpeta
# Hacer un script ejecutable y correrlo
chmod +x deploy.sh
./deploy.sh
# chown — cambiar propietario de un archivo
chown ana archivo.txt # cambiar propietario a "ana"
chown ana:developers archivo.txt # cambiar propietario y grupo
chown -R www-data:www-data /var/www/ # cambiar propietario recursivamente (típico en servidores)
# sudo — ejecutar como superusuario
sudo apt update # actualizar lista de paquetes
sudo apt install nginx # instalar software
sudo systemctl restart nginx # reiniciar servicio
sudo -i # abrir shell como root (usar con cuidado)SSH y conexión a servidores remotos
# Conectarse a un servidor por SSH
ssh usuario@ip-o-dominio
ssh ana@192.168.1.100
ssh ana@mi-servidor.com
ssh -p 2222 ana@servidor.com # puerto específico (por defecto es 22)
# Generar par de claves SSH (hacerlo una sola vez)
ssh-keygen -t ed25519 -C "tu@email.com"
# Genera: ~/.ssh/id_ed25519 (privada) y ~/.ssh/id_ed25519.pub (pública)
# Copiar tu clave pública al servidor (para conectarte sin contraseña)
ssh-copy-id usuario@servidor.com
# A partir de ahora: ssh usuario@servidor.com → sin pedir contraseña
# Configurar alias para conexiones frecuentes en ~/.ssh/config
# Host mi-vps
# HostName 192.168.1.100
# User ana
# IdentityFile ~/.ssh/id_ed25519
# Port 22
#
# Después puedes conectarte simplemente con:
ssh mi-vps
# Copiar archivos entre local y servidor remoto
scp archivo.txt usuario@servidor:/ruta/destino/ # subir archivo
scp usuario@servidor:/ruta/archivo.txt ./ # descargar archivo
scp -r carpeta/ usuario@servidor:/ruta/destino/ # subir carpeta completa
# rsync — sincronización eficiente (solo transfiere lo que cambió)
rsync -avz ./dist/ usuario@servidor:/var/www/html/ # desplegar frontend
rsync -avz --delete ./dist/ usuario@servidor:/var/www/ # con borrado de archivos eliminados
rsync -avz usuario@servidor:/backups/ ./backups-local/ # descargar backups
# Tunnel SSH: redirigir un puerto remoto al local
ssh -L 5432:localhost:5432 usuario@servidor
# Ahora puedes conectarte a la BD remota como si fuera local: localhost:5432
# Ejecutar un comando en el servidor remoto sin abrir sesión interactiva
ssh usuario@servidor "ls -la /var/www"
ssh usuario@servidor "cd /var/www && git pull && npm install && pm2 restart app"Gestión de paquetes del sistema
# Ubuntu / Debian (apt)
sudo apt update # actualizar la lista de paquetes disponibles
sudo apt upgrade # actualizar todos los paquetes instalados
sudo apt install nombre-paquete # instalar un paquete
sudo apt remove nombre-paquete # desinstalar (conserva configuración)
sudo apt purge nombre-paquete # desinstalar y borrar configuración
sudo apt autoremove # eliminar dependencias huérfanas
apt search "texto" # buscar paquetes disponibles
apt list --installed # listar paquetes instalados
# macOS (Homebrew)
brew update # actualizar Homebrew
brew upgrade # actualizar paquetes
brew install nombre-paquete # instalar paquete
brew uninstall nombre-paquete # desinstalar
brew list # listar paquetes instalados
brew search texto # buscar paquetes
brew info nombre-paquete # información de un paquete
brew doctor # diagnosticar problemas con la instalación
# Gestores de versiones de lenguajes (imprescindibles)
# nvm — Node Version Manager
nvm install 20 # instalar Node 20
nvm use 20 # usar Node 20 en la sesión actual
nvm alias default 20 # hacer Node 20 la versión por defecto
nvm ls # listar versiones instaladas
# pyenv — Python Version Manager
pyenv install 3.12.0 # instalar Python 3.12
pyenv global 3.12.0 # versión global por defecto
pyenv local 3.11.0 # versión local para el directorio actual
pyenv versions # listar versiones instaladasComandos útiles para el trabajo con código
# curl — hacer peticiones HTTP desde la terminal
curl https://api.github.com/users/torvalds # GET request
curl -s https://api.ejemplo.com/datos | json_pp # GET con formato JSON (-s = silencioso)
curl -X POST https://api.ejemplo.com/usuarios \
-H "Content-Type: application/json" \
-H "Authorization: Bearer tu_token" \
-d '{"nombre": "Ana", "email": "ana@mail.com"}'
curl -X PUT https://api.ejemplo.com/usuarios/1 \
-H "Content-Type: application/json" \
-d '{"nombre": "Ana García"}'
curl -X DELETE https://api.ejemplo.com/usuarios/1
# Descargar un archivo
curl -O https://ejemplo.com/archivo.zip # guarda con el nombre original
curl -o mi-nombre.zip https://ejemplo.com/archivo.zip # guarda con nombre personalizado
curl -L URL # sigue redirecciones
# wget — alternativa a curl para descargas
wget https://ejemplo.com/archivo.tar.gz
wget -r -np https://ejemplo.com/directorio/ # descarga recursiva
# jq — procesar JSON en la terminal (instalar aparte: brew install jq / apt install jq)
curl -s https://api.github.com/users/torvalds | jq .
curl -s https://api.github.com/users/torvalds | jq '.name, .company, .followers'
curl -s https://api.github.com/repos/torvalds/linux/commits | jq '.[0].commit.message'
cat datos.json | jq '.usuarios[] | select(.activo == true) | .email'
# Comprimir y descomprimir archivos
tar -czf archivo.tar.gz carpeta/ # comprimir carpeta
tar -xzf archivo.tar.gz # descomprimir
tar -xzf archivo.tar.gz -C /destino/ # descomprimir en directorio específico
tar -tzf archivo.tar.gz # ver contenido sin descomprimir
zip -r archivo.zip carpeta/ # comprimir en ZIP
unzip archivo.zip # descomprimir ZIP
unzip archivo.zip -d directorio/ # descomprimir en directorio específicoProductividad en la terminal
# history — ver historial de comandos
history # todos los comandos anteriores
history | tail -30 # últimos 30
history | grep "docker" # filtrar comandos de docker
# Ctrl+R — buscar en el historial (el atajo más útil de la terminal)
# Pulsa Ctrl+R y escribe parte del comando que buscas
# Ctrl+R de nuevo sigue buscando hacia atrás
# Atajos de teclado esenciales en la terminal
# Ctrl+C → cancelar el comando en ejecución
# Ctrl+Z → pausar el proceso (luego bg para reanudar en background)
# Ctrl+L → limpiar la pantalla (equivale a: clear)
# Ctrl+A → ir al inicio de la línea
# Ctrl+E → ir al final de la línea
# Ctrl+U → borrar desde el cursor hasta el inicio de la línea
# Ctrl+K → borrar desde el cursor hasta el final de la línea
# Ctrl+W → borrar la palabra anterior
# Tab → autocompletar comandos y rutas
# Tab Tab → mostrar todas las opciones posibles cuando hay ambigüedad
# alias — crear atajos de comandos personalizados
alias ll="ls -lah"
alias gs="git status"
alias gp="git push"
alias gc="git commit -m"
alias ..="cd .."
alias ...="cd ../.."
alias dev="cd ~/proyectos && code ."
# Para que los alias persistan, añádelos a ~/.zshrc o ~/.bashrc:
echo 'alias ll="ls -lah"' >> ~/.zshrc
source ~/.zshrc
# Aliases útiles para programadores
alias python="python3"
alias pip="pip3"
alias serve="python3 -m http.server 8080" # servidor HTTP estático rápido
alias ports="lsof -i -P -n | grep LISTEN" # ver qué puertos están en uso
alias myip="curl -s https://ipinfo.io/ip" # ver tu IP pública
alias weather="curl -s wttr.in/Madrid" # ver el tiempo (sí, funciona)
# Comandos que todo dev debería tener en su .zshrc/.bashrc
# Mostrar la rama de git en el prompt, historial infinito, autocompletado mejorado
# Considera usar Oh My Zsh (https://ohmyz.sh) para una configuración completa
# screen / tmux — mantener sesiones de terminal persistentes en servidores
tmux new -s nombre-sesion # crear nueva sesión
tmux attach -t nombre-sesion # reconectar a sesión existente
tmux ls # listar sesiones
# Dentro de tmux:
# Ctrl+B d → desconectar sin cerrar (la sesión sigue corriendo)
# Ctrl+B c → nueva ventana
# Ctrl+B n → siguiente ventana
# Ctrl+B % → dividir pantalla verticalmente
# Ctrl+B " → dividir pantalla horizontalmenteResumen: los 20 comandos más usados
| Comando | Para qué sirve | Ejemplo rápido |
|---|---|---|
ls -lah | Listar archivos con detalles | ls -lah src/ |
cd | Cambiar de directorio | cd ../proyectos |
mkdir -p | Crear directorios anidados | mkdir -p src/components/ui |
mv | Mover o renombrar | mv viejo.js nuevo.js |
cp -r | Copiar carpetas | cp -r src/ backup/ |
rm -rf | Eliminar (con precaución) | rm -rf node_modules/ |
cat | Ver contenido de archivo | cat .env.example |
tail -f | Seguir logs en tiempo real | tail -f server.log |
grep -rn | Buscar texto en archivos | grep -rn "TODO" src/ |
find | Buscar archivos | find . -name "*.env" |
| (pipe) | Encadenar comandos | ps aux | grep node |
chmod | Cambiar permisos | chmod +x deploy.sh |
ssh | Conectar a servidor remoto | ssh user@servidor.com |
scp | Copiar archivos por SSH | scp -r dist/ user@server:/var/www |
curl | Peticiones HTTP | curl -X POST https://api.com/data |
lsof -i :PORT | Ver qué usa un puerto | lsof -i :3000 |
kill -9 | Terminar proceso | kill -9 $(lsof -ti :3000) |
export | Definir variable de entorno | export NODE_ENV=production |
Ctrl+R | Buscar en historial | Pulsa y escribe el comando |
alias | Crear atajos personalizados | alias gs="git status" |
No hay comentarios todavía. Sé el primero en compartir tu opinión.