Los comandos de terminal que todo programador debe saber sí o sí

D
DanisCh
(Actualizado: ) • 16 min de lectura
Los comandos de terminal que todo programador debe saber sí o sí
Buenas Prácticas

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 carpetas

Crear, 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 actual

Ver 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 ejecutaste

Gestió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 SSH

Variables 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/git

Permisos 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 instaladas

Comandos ú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ífico

Productividad 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 horizontalmente

Resumen: los 20 comandos más usados

ComandoPara qué sirveEjemplo rápido
ls -lahListar archivos con detallesls -lah src/
cdCambiar de directoriocd ../proyectos
mkdir -pCrear directorios anidadosmkdir -p src/components/ui
mvMover o renombrarmv viejo.js nuevo.js
cp -rCopiar carpetascp -r src/ backup/
rm -rfEliminar (con precaución)rm -rf node_modules/
catVer contenido de archivocat .env.example
tail -fSeguir logs en tiempo realtail -f server.log
grep -rnBuscar texto en archivosgrep -rn "TODO" src/
findBuscar archivosfind . -name "*.env"
| (pipe)Encadenar comandosps aux | grep node
chmodCambiar permisoschmod +x deploy.sh
sshConectar a servidor remotossh user@servidor.com
scpCopiar archivos por SSHscp -r dist/ user@server:/var/www
curlPeticiones HTTPcurl -X POST https://api.com/data
lsof -i :PORTVer qué usa un puertolsof -i :3000
kill -9Terminar procesokill -9 $(lsof -ti :3000)
exportDefinir variable de entornoexport NODE_ENV=production
Ctrl+RBuscar en historialPulsa y escribe el comando
aliasCrear atajos personalizadosalias gs="git status"
Etiquetas: Terminal Comandos

¿Te ha gustado esta entrada?

Compártela con tus compañeros para que también sigan aprendiendo.

Comunidad y Comentarios

0 COMENTARIOS

No hay comentarios todavía. Sé el primero en compartir tu opinión.

Escribe tu opinión
Respondiendo a