Guía rápida de comandos de Linux: más de 200 comandos por tarea

Comandos de Linux por tarea, desde archivos y permisos hasta redes, systemd y procesamiento de texto. Cada entrada incluye opciones, ejemplos para copiar y notas para macOS.

Guía rápida de comandos de Linux · freetoolsforweb.com/tools/linux-commands-cheat-sheet · verificado el 2026-10-18

Última verificación: 2026-10-18, verificado con los manuales de GNU coreutils 9.x, util-linux, procps-ng, iproute2, systemd y bash 5.2; las notas de macOS, con las páginas man de macOS 26.

215 entradas en 15 secciones

Ver y editar texto

Lee archivos, recorre logs página a página, edita en la terminal y compara versiones.

cat

Mostrar o unir archivos

Linux · macOS#
cat [-n] [-A] file...
-n
numera todas las líneas
-A
muestra los tabuladores como ^I y los finales de línea como $ (GNU); deja ver los finales de línea CRLF
cat /etc/os-release

mostrar un archivo

cat part1.txt part2.txt > whole.txt

concatenar

cat -A script.sh | head

detectar tabuladores ocultos y finales de línea ^M de Windows

macOS/BSD: cat de macOS no tiene -A; usa cat -vet para obtener lo mismo.

tac

Mostrar un archivo empezando por la última línea

Linux#
tac file
tac access.log | head

las líneas de log más recientes primero

macOS/BSD: No existe en macOS; usa tail -r file.

less

Recorrer página a página un archivo o una salida larga

Linux · macOS#
less [-N] [-S] [+F] file
Space / b
página abajo / arriba
/text
busca hacia delante; n siguiente, N anterior
g / G
salta al principio / al final
F
sigue el archivo como tail -f; Ctrl+C para parar
q
salir
-N
muestra los números de línea
-S
no ajusta las líneas largas (desplazamiento horizontal)
less /var/log/syslog

leer un log

journalctl -u nginx | less -S

líneas anchas sin ajustar

head

Mostrar las primeras líneas de un archivo

Linux · macOS#
head [-n N] [-c N] file...
-n N
las primeras N líneas (10 por defecto)
-c N
los primeros N bytes
-n -N
todo excepto las últimas N líneas (GNU)
head -n 20 data.csv

la cabecera y las primeras filas

head -c 512 file.bin | xxd

echar un vistazo al principio de un binario

macOS/BSD: head de macOS no acepta cantidades negativas.

tail

Mostrar el final de un archivo o seguirlo en directo

Linux · macOS#
tail [-n N] [-f|-F] file...
-n N
las últimas N líneas (10 por defecto)
-n +N
empieza en la línea N
-f
sigue mostrando líneas a medida que crece el archivo
-F
sigue por nombre; sobrevive a la rotación de logs
tail -n 50 app.log

las últimas 50 líneas

tail -F /var/log/nginx/access.log

vigilar un log que se rota

tail -n +2 data.csv

saltarse la línea de cabecera de un CSV

nano

Editar un archivo con un editor sencillo

Linux#
nano file
Ctrl+O
guardar
Ctrl+X
salir
Ctrl+W
buscar
Ctrl+K / Ctrl+U
cortar línea / pegar
Alt+U
deshacer
sudo nano /etc/hosts

editar un archivo del sistema

La barra de atajos de la parte inferior de la pantalla muestra las teclas; ^ significa Ctrl y M- significa Alt.

vim

Editar un archivo con vim (y cómo salir)

Linux · macOS#
vim file
i
modo inserción (escribir texto)
Esc
vuelve al modo normal
:w / :q / :wq
guardar / salir / guardar y salir
:q!
salir sin guardar
/text
buscar; n para el siguiente
dd / yy / p
borrar línea / copiar línea / pegar
u / Ctrl+R
deshacer / rehacer
vim +42 app.py

abrir en la línea 42

diff

Comparar dos archivos o directorios

Linux · macOS#
diff [-u] [-r] [-q] [-w] a b
-u
formato unificado (el que usan patch y git)
-r
compara directorios de forma recursiva
-q
solo indica si los archivos son distintos
-w
ignora todos los espacios en blanco
-y
lado a lado
diff -u old.conf new.conf

vista de cambios legible

diff -rq dir1/ dir2/

qué archivos difieren entre dos árboles

diff <(sort a.txt) <(sort b.txt)

comparar tras ordenar, mediante sustitución de procesos

tee

Escribir la salida en un archivo y en pantalla a la vez

Linux · macOS#
tee [-a] file...
-a
añade al final en lugar de sobrescribir
make 2>&1 | tee build.log

ver una compilación y guardar un log

echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf

añadir a un archivo propiedad de root (sudo echo >> falla porque la redirección la hace el shell)

printf

Mostrar texto con formato de forma fiable

Linux · macOS#
printf 'format' args...
printf '%s\n' "$var"

mostrar una variable de forma segura, aunque empiece por -n

printf '%-12s %6.2f\n' disk 93.5

columnas alineadas

echo -e y echo -n se comportan distinto según el shell; printf se comporta igual en todas partes.

column

Alinear la salida en forma de tabla

Linux · macOS#
column -t [-s separators]
column -t -s, data.csv | less -S

leer un CSV sencillo como tabla

mount | column -t

alinear una salida separada por espacios

xxd / hexdump

Ver un archivo en hexadecimal

Linux · macOS#
xxd file | hexdump -C file
xxd image.png | head

hexadecimal y ASCII lado a lado

hexdump -C file.bin | head

volcado hexadecimal canónico

xxd forma parte de los paquetes de vim; hexdump está en util-linux (bsdextrautils en Debian/Ubuntu recientes).

strings

Extraer el texto legible de un archivo binario

Linux · macOS#
strings [-n min] file
-n N
solo cadenas de al menos N caracteres (4 por defecto)
strings -n 8 firmware.bin | less

encontrar cadenas de versión, URL y rutas

Forma parte de binutils en Linux.

Permisos y propietarios

Consulta y cambia quién puede leer, escribir y ejecutar un archivo.

ls -l

Leer una cadena de permisos como -rwxr-x---

Linux · macOS#
ls -l file
ls -l deploy.sh

-rwxr-x--- 1 alice devs 812 Oct 18 09:12 deploy.sh

El primer carácter es el tipo (- archivo, d directorio, l enlace simbólico). Después vienen tres tríos: propietario, grupo y el resto. r=4, w=2, x=1, así que rwxr-x--- es 750.

chmod

Cambiar permisos con números octales

Linux · macOS#
chmod [-R] mode file...
-R
se aplica a un directorio y a todo su contenido
-v
informa de cada cambio
chmod 644 index.html

propietario lectura/escritura, todos lectura: archivos normales

chmod 755 deploy.sh

propietario todo, los demás lectura/ejecución: scripts y directorios

chmod 600 ~/.ssh/id_ed25519

clave privada legible solo por ti; ssh rechaza claves con permisos más laxos

chmod u+x

Cambiar permisos con letras (u/g/o +/-)

Linux · macOS#
chmod [ugoa][+-=][rwxX] file...
chmod +x script.sh

hacer ejecutable un script

chmod go-w file

quitar la escritura al grupo y a los demás

chmod -R u=rwX,go=rX site/

la X mayúscula solo da permiso de ejecución a los directorios y a los archivos que ya lo tenían

chmod -R 777

Por qué chmod -R 777 no es la solución

PeligrosoLinux · macOS#
chmod -R 777 dir
find site/ -type d -exec chmod 755 {} +

la solución correcta, parte 1: directorios a 755

find site/ -type f -exec chmod 644 {} +

parte 2: archivos a 644

Peligro: Da permiso de escritura sobre todo el árbol a cualquier usuario y a cualquier servicio comprometido de la máquina, marca todos los archivos como ejecutables y hace que OpenSSH rechace las claves si ~/.ssh tiene 777. Aplicado a /etc o /usr puede romper sudo y el sistema. Corrige el propietario con chown, o usa los dos comandos find.

chown

Cambiar el propietario y el grupo de archivos

PeligrosoLinux · macOS#
chown [-R] user[:group] file...
-R
recursivo
user:
con dos puntos al final y sin grupo, también asigna como grupo el grupo de inicio de sesión del usuario
sudo chown -R www-data:www-data /var/www/site

dar la raíz web al usuario del servidor web

sudo chown "$USER": file.txt

apropiarte de un archivo creado por root

Peligro: sudo chown -R sobre /, /usr o /etc elimina los bits setuid y los propietarios de los que dependen sudo, passwd y los servicios; recuperarse suele implicar reinstalar. Revisa bien la ruta.

chgrp

Cambiar solo el grupo de archivos

Linux · macOS#
chgrp [-R] group file...
chgrp -R developers /srv/shared

asignar una carpeta compartida al grupo de un equipo

umask

Definir los permisos predeterminados de los archivos nuevos

Linux · macOS#
umask [mask]
umask

muestra la máscara actual, normalmente 0022

umask 077

archivos nuevos a 600 y directorios a 700 en este shell

La máscara quita bits: los archivos parten de 666 y los directorios de 777, así que 022 da 644 y 755.

sudo

Ejecutar un comando como root (u otro usuario)

Linux · macOS#
sudo [-u user] [-i] command
-i
shell de inicio de sesión de root
-u user
ejecuta como ese usuario en lugar de root
-l
lista lo que tienes permitido ejecutar
-k
olvida las credenciales en caché
sudo systemctl restart nginx

un comando de administración

sudo !!

volver a ejecutar el comando anterior con sudo

sudo -u postgres psql

ejecutar como usuario de un servicio

su

Cambiar a otro usuario

Linux · macOS#
su [-] [user]
su - deploy

iniciar sesión como deploy con su entorno

sudo su -

shell de root cuando root no tiene contraseña (sudo -i hace lo mismo)

setfacl / getfacl

Dar acceso a un usuario más con ACL

Linux#
setfacl -m u:user:perms file
-m
modifica (añade) una entrada
-x
elimina una entrada
-b
elimina todas las entradas de la ACL
-R
recursivo
-d
define la ACL predeterminada que heredan los archivos nuevos
setfacl -m u:alice:rw report.xlsx

alice puede leer y escribir, sin cambiar el grupo

getfacl report.xlsx

mostrar todas las entradas

setfacl -R -m g:devs:rwX /srv/app

un grupo obtiene acceso a todo un árbol

Un + al final de la cadena de permisos de ls -l indica que el archivo tiene una ACL.

chattr / lsattr

Hacer inmutable un archivo

Linux#
chattr +i|-i file
sudo chattr +i /etc/resolv.conf

nadie, ni siquiera root, puede modificarlo ni borrarlo hasta que se le quite con -i

lsattr /etc/resolv.conf

mostrar los atributos; i significa inmutable

Compatible con ext4, XFS y Btrfs. Si aparece "Operation not permitted" incluso como root, revisa lsattr.

Procesos y trabajos

Averigua qué se está ejecutando, detenlo y ejecuta cosas en segundo plano.

ps

Listar los procesos en ejecución

Linux · macOS#
ps aux | ps -ef | ps -o fields -p PID
aux
todos los procesos con CPU, memoria y usuario (estilo BSD)
-ef
todos los procesos con el PID del padre (estilo System V)
-o
elige las columnas
--sort=-%mem
ordena por memoria, de mayor a menor (procps)
ps aux | grep [n]ginx

el truco de [n] evita que el propio grep salga en los resultados

ps aux --sort=-%mem | head

los procesos que más memoria usan

ps -o pid,ppid,etime,cmd -p 1234

cuánto tiempo lleva en ejecución un proceso

macOS/BSD: ps de macOS no tiene --sort; usa ps aux -m (por memoria) o ps aux -r (por CPU).

pstree

Mostrar los procesos como árbol padre/hijo

Linux#
pstree [-p] [user|PID]
pstree -p

con los PID

pstree -p 1234

qué procesos ha lanzado un proceso

top

Ver el uso de CPU y memoria en directo

Linux · macOS#
top [-u user] [-p PID] [-b -n 1]
P / M
ordena por CPU / memoria (top de Linux)
1
muestra cada núcleo de CPU
k
mata un proceso por su PID
q
salir
-b -n 1
una sola captura en modo batch, para scripts
top -b -n 1 | head -20

captura que puedes pegar en una incidencia

macOS/BSD: top de macOS es un programa distinto: ordena con top -o cpu o top -o mem.

htop

Visor interactivo de procesos más amigable

Linux#
htop [-u user]
F3 or /
buscar
F4
filtrar
F6
elegir la columna de orden
F9
enviar una señal (kill)
t
vista de árbol
htop -u www-data

solo los procesos de un usuario

Instálalo con apt install htop / dnf install htop.

pgrep

Buscar los ID de proceso por nombre

Linux · macOS#
pgrep [-a] [-f] [-u user] pattern
-a
muestra la línea de comandos completa (procps de Linux)
-f
busca en la línea de comandos completa, no solo en el nombre
-u user
solo los procesos de ese usuario
-x
coincidencia exacta del nombre
pgrep -a nginx

PID y líneas de comandos

pgrep -f 'python manage.py runserver'

encontrar un script por sus argumentos

macOS/BSD: En macOS, -a significa "incluir los ancestros"; usa pgrep -lf para ver los nombres y los argumentos.

pkill

Detener procesos por nombre

Linux · macOS#
pkill [-signal] [-f] [-u user] pattern
pkill -f "node server.js"

detener una app de Node

pkill -HUP nginx

enviar una señal de recarga

pgrep -af node

ver qué coincidiría con -f antes de matar nada

Los patrones son expresiones regulares que coinciden en cualquier parte del nombre; pkill node también afecta a nodejs-helper. Compruébalo antes con pgrep.

kill

Enviar una señal a un proceso (detener, matar, recargar)

Linux · macOS#
kill [-signal] PID...
(none) / -15 / -TERM
pide al proceso que termine limpiamente (predeterminado)
-9 / -KILL
fuerza la terminación; no se puede capturar, no hay limpieza
-1 / -HUP
muchos demonios recargan su configuración
-l
lista los nombres de las señales
kill 1234

detención educada

kill -9 1234

último recurso cuando se ignora TERM

kill %1

matar el trabajo 1 de este shell

Prueba primero con kill a secas y espera unos segundos: -9 se salta la limpieza, así que pueden quedar archivos temporales, bloqueos y datos a medio escribir.

killall

Matar todos los procesos con un nombre exacto

Linux · macOS#
killall [-signal] name
killall firefox

todos los procesos de Firefox

En Linux está en el paquete psmisc.

Ctrl+Z, bg, fg, jobs

Pausar un comando y seguir ejecutándolo en segundo plano

Linux · macOS#
Ctrl+Z; bg [%n]; fg [%n]; jobs
jobs

listar los trabajos de este shell con su número

bg %1

reanudar el trabajo 1 en segundo plano

fg %1

devolverlo al primer plano

Ctrl+Z suspende el programa en primer plano (se detiene hasta que uses bg o fg).

&

Iniciar un comando en segundo plano

Linux · macOS#
command &
./long-export.sh > export.log 2>&1 &

lanzarlo y recuperar el prompt

wait

en un script, esperar a que terminen los trabajos en segundo plano

nohup

Mantener un comando en ejecución después de cerrar sesión

Linux · macOS#
nohup command > log 2>&1 &
nohup ./server > server.log 2>&1 &

sobrevive al cierre de la sesión SSH

Para cualquier cosa de larga duración, un servicio de systemd (consulta Servicios y logs) o tmux es más robusto.

disown

Desvincular del shell un trabajo que ya está en ejecución

Linux · macOS#
disown [-h] [%n]
disown -h %1

se te olvidó nohup: pásalo a segundo plano con bg y luego usa disown

tmux

Mantener viva una sesión de terminal aunque se corte la conexión

Linux#
tmux new -s name | tmux attach -t name
Ctrl+B d
desconectarse (la sesión sigue en ejecución)
Ctrl+B c
nueva ventana
Ctrl+B % / Ctrl+B "
dividir en izquierda/derecha / arriba/abajo
tmux ls
listar las sesiones
tmux new -s deploy

iniciar una sesión con nombre

tmux attach -t deploy

volver a conectarse tras perder el SSH

Instálalo con tu gestor de paquetes. GNU screen es la alternativa más antigua (Ctrl+A d para desconectarte, screen -r para volver a conectarte).

nice / renice

Ejecutar un comando con menor (o mayor) prioridad de CPU

Linux · macOS#
nice -n N command | renice -n N -p PID
nice -n 19 tar -czf backup.tgz /data

copia de seguridad que no estorba

sudo renice -n -5 -p 1234

subir la prioridad de un proceso en ejecución

El valor nice va de -20 (máxima prioridad) a 19 (mínima). Solo root puede bajar de 0.

timeout

Matar un comando si tarda demasiado

Linux#
timeout [-s signal] duration command
timeout 30s curl -s https://example.com/health

rendirse al cabo de 30 segundos

timeout -s KILL 5m ./job.sh

matarlo a la fuerza al cabo de cinco minutos

Sale con el código 124 cuando se alcanza el límite de tiempo.

watch

Repetir un comando cada pocos segundos

Linux#
watch [-n seconds] [-d] command
watch -n 2 df -h

ver cómo se llena el disco

watch -d 'ss -s'

-d resalta lo que ha cambiado

lsof

Ver qué proceso tiene abierto un archivo o un puerto

Linux · macOS#
lsof [-i :port] [-p PID] [file]
sudo lsof -i :8080

qué está escuchando en el puerto 8080

sudo lsof +L1

archivos borrados que siguen abiertos (disco lleno pero du no muestra nada)

lsof -p 1234

todos los archivos que tiene abiertos un proceso

fuser

Encontrar (o matar) lo que está usando un punto de montaje o un puerto

PeligrosoLinux#
fuser [-v] [-m] [-k] target
sudo fuser -vm /mnt/usb

por qué umount dice "target is busy"

sudo fuser -v 8080/tcp

el proceso de un puerto TCP

Peligro: fuser -k mata sin preguntar todos los procesos que usan el destino; en un punto de montaje, eso puede incluir tu propio shell.

time

Medir cuánto tarda un comando

Linux · macOS#
time command
time ./build.sh

real = tiempo de reloj, user + sys = tiempo de CPU

strace

Rastrear las llamadas al sistema que hace un programa

Linux#
strace [-f] [-e trace=...] command | strace -p PID
strace -f -e trace=openat ./app 2>&1 | grep -v ENOENT

¿qué archivos abre realmente?

sudo strace -p 1234

¿en qué se ha quedado atascado un proceso colgado?

Información del sistema y recursos

Versión del sistema operativo, kernel, CPU, memoria, hardware, hora y carga.

uname

Ver la versión del kernel y la arquitectura

Linux · macOS#
uname [-a|-r|-m]
-a
todo
-r
versión del kernel
-m
arquitectura de la máquina: x86_64, aarch64
uname -r

p. ej. 6.8.0-45-generic

uname -m

qué binario descargar: x86_64 o aarch64

cat /etc/os-release

Averiguar la distribución de Linux y su versión

Linux#
cat /etc/os-release
cat /etc/os-release

NAME, VERSION_ID e ID en cualquier distribución con systemd

lsb_release -a

alternativa en Debian/Ubuntu, si está instalado

macOS/BSD: macOS: sw_vers.

hostnamectl

Ver o cambiar el nombre del equipo

Linux#
hostnamectl [set-hostname name]
hostnamectl

nombre del equipo, sistema operativo, kernel, virtualización

sudo hostnamectl set-hostname web01

renombrar la máquina

uptime

Ver el tiempo encendido y la carga media

Linux · macOS#
uptime
uptime

carga media de los últimos 1, 5 y 15 minutos

La carga es el número de procesos en ejecución o en espera. Compárala con el número de CPU (nproc): una carga de 4 en 4 núcleos significa que están totalmente ocupados.

free

Consultar el uso de memoria y swap

Linux#
free [-h]
free -h

fíjate en la columna "available", no en "free"

macOS/BSD: macOS: vm_stat, o top -l 1 | grep PhysMem.

Linux usa la RAM sobrante como caché de disco, así que "free" parece bajo en una máquina sana. "available" es lo que los programas aún pueden obtener.

lscpu / nproc

Ver el modelo de CPU y el número de núcleos

Linux#
lscpu | nproc
lscpu

modelo, sockets, núcleos, hilos, flags

make -j"$(nproc)"

usar todos los núcleos disponibles

macOS/BSD: macOS: sysctl -n hw.ncpu y sysctl -n machdep.cpu.brand_string.

lspci / lsusb

Listar los dispositivos PCI y USB

Linux#
lspci [-k] | lsusb
lspci -k | grep -A3 -i vga

la tarjeta gráfica y el driver que usa

lsusb

¿se detecta siquiera el dispositivo USB?

dmidecode / lshw

Ver las ranuras de RAM, la BIOS y los detalles del hardware

Linux#
sudo dmidecode -t type | sudo lshw -short
sudo dmidecode -t memory | grep -i size

RAM instalada por ranura

sudo lshw -short

una línea por dispositivo

dmesg

Leer los mensajes del kernel (hardware, drivers, procesos matados por falta de memoria)

Linux#
dmesg [-T] [-w] [--level=...]
-T
marcas de tiempo legibles
-w
sigue los mensajes nuevos
--level=err,warn
solo los problemas
sudo dmesg -T | tail -30

qué acaba de pasar (USB conectado, errores de disco)

sudo dmesg -T | grep -i 'out of memory'

¿ha detenido el OOM killer tu app?

/proc

Leer la información en bruto de CPU, memoria y procesos desde /proc

Linux#
cat /proc/<file>
grep MemAvailable /proc/meminfo

memoria disponible en kB

grep -c ^processor /proc/cpuinfo

número de CPU lógicas

cat /proc/1234/status

estado y memoria de un proceso

vmstat / iostat

Ver si el cuello de botella es la CPU, la memoria o el disco

Linux#
vmstat interval count | iostat -xz interval
vmstat 1 5

r = cola de ejecución, si/so = uso de swap, wa = espera de E/S

iostat -xz 1

uso por disco (%util) y latencia (await)

iostat viene en el paquete sysstat.

date

Mostrar o calcular fechas y marcas de tiempo Unix

Linux · macOS#
date [+format] [-d 'description']
+%F
YYYY-MM-DD
+%s
marca de tiempo Unix (segundos)
-d 'text'
interpreta una fecha: tomorrow, 2 days ago, @1700000000 (GNU)
-u
UTC
date '+%Y-%m-%d %H:%M:%S'

marca de tiempo para logs

date +%s

segundos desde el 1970-01-01 UTC

date -d @1700000000

de marca de tiempo a fecha (GNU)

date -d '2 days ago' +%F

fecha relativa (GNU)

macOS/BSD: date de macOS no tiene -d. Usa date -r 1700000000 para una marca de tiempo, date -v-2d para "hace 2 días" y date -j -f '%Y-%m-%d' 2026-10-18 +%s para interpretar una fecha.

timedatectl

Configurar la zona horaria y comprobar la sincronización del reloj

Linux#
timedatectl [set-timezone Zone]
timedatectl

hora local, UTC, zona horaria, ¿sincronizado por NTP?

timedatectl list-timezones | grep America

encontrar el nombre de la zona

sudo timedatectl set-timezone America/Toronto

cambiarla

Discos y sistemas de archivos

Espacio libre, qué lo ocupa, particiones, montaje y formateo.

df

Consultar el espacio libre en disco

Linux · macOS#
df [-h] [-T] [-i] [path]
-h
tamaños legibles
-T
muestra el tipo de sistema de archivos (GNU)
-i
uso de inodos en lugar de bytes
df -h

todos los sistemas de archivos montados

df -h .

el sistema de archivos en el que está este directorio

df -i

¿"No space left" con bytes libres? Puede que te hayas quedado sin inodos

macOS/BSD: En macOS, -T filtra por tipo en vez de mostrarlo.

du

Averiguar qué ocupa el espacio en disco

Linux · macOS#
du [-s] [-h] [-d depth] [path...]
-s
un total por argumento
-h
tamaños legibles
-d N
límite de profundidad (forma larga de GNU: --max-depth=N)
-x
no sale del sistema de archivos
du -sh /var/log

tamaño de una carpeta

du -h -d 1 | sort -h

subcarpetas, la más grande al final (funciona en GNU y macOS)

sudo du -xh -d 1 / | sort -h | tail

los directorios de primer nivel más grandes

macOS/BSD: du de macOS tiene -d pero no --max-depth.

ncdu

Explorar el uso del disco de forma interactiva

Linux#
ncdu [-x] [path]
sudo ncdu -x /

navega con las flechas, d para borrar

Instálalo con apt install ncdu / dnf install ncdu.

lsblk

Listar discos y particiones

Linux#
lsblk [-f]
-f
tipo de sistema de archivos, etiqueta, UUID y punto de montaje
lsblk

discos, particiones, tamaños y puntos de montaje

lsblk -f

qué partición es ext4/xfs, y su UUID

macOS/BSD: macOS: diskutil list.

blkid

Obtener el UUID de una partición

Linux#
sudo blkid [device]
sudo blkid /dev/sdb1

UUID y TYPE, para /etc/fstab

findmnt

Ver qué está montado y dónde

Linux#
findmnt [target] | findmnt -T path
findmnt

árbol de montajes con sus opciones

findmnt -T /var/lib/docker

qué sistema de archivos contiene esta ruta

sudo findmnt --verify

buscar errores en /etc/fstab antes de reiniciar

mount

Montar un disco o una partición

Linux#
mount [-t type] [-o options] device dir
sudo mount /dev/sdb1 /mnt/usb

montar un pendrive USB (el directorio debe existir)

sudo mount -o remount,rw /

hacer escribible una raíz de solo lectura

sudo mount -t nfs nas:/export /mnt/nas

montar un recurso compartido NFS

umount

Desmontar un disco

Linux#
umount dir|device
sudo umount /mnt/usb

después de esto ya puedes desconectarlo

sudo umount -l /mnt/nas

diferido: lo desconecta ya y lo limpia cuando deje de estar ocupado

"target is busy" significa que un proceso lo está usando (a menudo tu propio shell, situado en ese directorio): encuéntralo con fuser -vm o lsof.

/etc/fstab

Montar un disco automáticamente al arrancar

Linux#
UUID=<uuid> <mountpoint> <type> <options> <dump> <pass>
UUID=3f6c...  /data  ext4  defaults,nofail  0  2

una línea por sistema de archivos; nofail permite que el arranque continúe si falta el disco

sudo mount -a

montar ya todo lo que hay en fstab: pruébalo antes de reiniciar

Una errata en fstab puede hacer que el siguiente arranque entre en modo de emergencia. Ejecuta siempre sudo mount -a (o findmnt --verify) después de editarlo.

fdisk / parted

Ver o editar tablas de particiones

PeligrosoLinux#
sudo fdisk -l | sudo fdisk /dev/sdX | sudo parted /dev/sdX print
sudo fdisk -l

todos los discos y sus particiones

sudo parted /dev/sdb print

tipo de tabla de particiones (gpt/msdos) y distribución

Peligro: Escribir una tabla de particiones (w en fdisk, mklabel en parted) deja inaccesibles los datos que hubiera en ese disco. Confirma antes el nombre del dispositivo con lsblk; /dev/sda y /dev/sdb se intercambian con facilidad.

mkfs

Formatear una partición

PeligrosoLinux#
sudo mkfs.<type> device
sudo mkfs.ext4 -L data /dev/sdb1

ext4 con etiqueta

sudo mkfs.vfat -F 32 /dev/sdc1

FAT32 para un pendrive USB que puedan leer otros dispositivos

Peligro: Borra al instante el sistema de archivos del destino, sin confirmación si el dispositivo no está montado. Comprueba el dispositivo con lsblk -f; formatear /dev/sda en lugar de /dev/sda1, o el disco equivocado, lo destruye.

fsck

Comprobar y reparar un sistema de archivos

PeligrosoLinux#
sudo fsck [-f] device
sudo fsck -f /dev/sdb1

forzar una comprobación completa de una partición desmontada

Peligro: Nunca ejecutes fsck en un sistema de archivos montado en lectura/escritura: puede corromperlo. Desmóntalo antes o, si es el sistema de archivos raíz, arranca desde un medio de rescate.

dd

Grabar una ISO en un pendrive USB o copiar un disco en bruto

PeligrosoLinux · macOS#
dd if=input of=output bs=size [status=progress] [conv=fsync]
if= / of=
archivo o dispositivo de entrada / salida
bs=4M
tamaño de bloque; cuanto mayor, más rápido
status=progress
muestra los bytes copiados (GNU)
conv=fsync
vuelca los datos al dispositivo antes de salir
sudo dd if=ubuntu.iso of=/dev/sdX bs=4M status=progress conv=fsync

crear un USB de arranque (sustituye sdX por el disco entero, no por una partición)

dd if=/dev/zero of=test.img bs=1M count=100

crear un archivo de 100 MB

Peligro: dd sobrescribe el destino of= sin preguntar. Intercambiar if= y of=, o elegir el /dev/sdX equivocado, borra ese disco. Compruébalo con lsblk justo antes de ejecutarlo.

macOS/BSD: macOS: usa como destino /dev/rdiskN (de diskutil list) tras diskutil unmountDisk, usa bs=4m y pulsa Ctrl+T para ver el progreso.

sync

Volcar al disco las escrituras pendientes

Linux · macOS#
sync
sync && sudo umount /mnt/usb

antes de sacar una unidad USB

swapon / mkswap

Consultar o añadir espacio de swap

Linux#
swapon --show | mkswap file && swapon file
swapon --show

swap actual

sudo fallocate -l 2G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile

añadir un archivo de swap de 2 GB (añádelo a /etc/fstab para conservarlo)

En Btrfs, un archivo de swap necesita pasos adicionales (btrfs filesystem mkswapfile en versiones recientes de btrfs-progs).

shred

Sobrescribir un archivo antes de borrarlo

PeligrosoLinux#
shred [-u] [-n passes] file
shred -u -n 3 secrets.txt

sobrescribir tres veces y luego borrar

Peligro: Irreversible. Además, no es fiable en SSD, en sistemas de archivos con journaling o copy-on-write (Btrfs, ZFS) ni en nada con snapshots; para una protección real, usa cifrado de disco completo.

Redes

Direcciones IP, rutas, puertos abiertos, peticiones HTTP, DNS, SSH y transferencia de archivos.

ip addr

Ver las direcciones IP de esta máquina

Linux#
ip [-br] addr [show dev IFACE]
ip -br a

una línea por interfaz: nombre, estado, direcciones

ip a show eth0

una interfaz en detalle

hostname -I

solo las direcciones IP

macOS/BSD: macOS: ifconfig, o ipconfig getifaddr en0.

ip sustituye al antiguo ifconfig (net-tools), que muchas distribuciones ya no instalan.

ip route

Ver la tabla de rutas y la puerta de enlace predeterminada

Linux#
ip route [get ADDRESS] | ip route add NET via GW
ip r

rutas; "default via" es la puerta de enlace

ip route get 1.1.1.1

qué interfaz y qué puerta de enlace usa un destino

sudo ip route add 10.20.0.0/16 via 192.168.1.1

añadir una ruta (se pierde al reiniciar)

ip link

Activar o desactivar una interfaz de red

PeligrosoLinux#
ip link [set IFACE up|down]
ip link

interfaces y direcciones MAC

sudo ip link set eth0 down && sudo ip link set eth0 up

reiniciar una interfaz

Peligro: Si desactivas la interfaz por la que estás conectado por SSH, se corta tu sesión.

ss

Listar los puertos en escucha y las conexiones abiertas

Linux#
ss [-t] [-u] [-l] [-p] [-n]
-t / -u
TCP / UDP
-l
solo sockets en escucha
-p
muestra el proceso (con sudo para ver los de otros usuarios)
-n
puertos numéricos, sin DNS
-s
recuento resumido
sudo ss -tulpn

todos los puertos en escucha y su programa

ss -tn state established '( dport = :443 )'

conexiones establecidas al puerto 443

ss -s

totales de conexiones

macOS/BSD: macOS: lsof -iTCP -sTCP:LISTEN -n -P, o netstat -an.

ss sustituye a netstat; netstat -tulpn sigue funcionando donde está instalado net-tools.

curl

Hacer una petición HTTP o descargar un archivo

Linux · macOS#
curl [options] URL
-I
solo las cabeceras (petición HEAD)
-L
sigue las redirecciones
-o file / -O
guarda en un archivo / guarda con el nombre remoto
-s / -S
silencioso / pero muestra los errores
-f
falla (código 22) ante HTTP 4xx/5xx en lugar de mostrar la página de error
-v
detallado: cabeceras de petición y respuesta, TLS
curl -I https://example.com

línea de estado y cabeceras

curl -LO https://example.com/file.tar.gz

descargar siguiendo redirecciones

curl -s -o /dev/null -w '%{http_code}\n' https://example.com

solo el código de estado

curl -fsSL https://example.com/install.sh -o install.sh

descargar un script para leerlo antes de ejecutarlo

curl -d

Enviar una petición POST con JSON

Linux · macOS#
curl -H 'Content-Type: application/json' -d 'json' URL
-d data
cuerpo de la petición; implica POST
--data-binary @file
envía un archivo tal cual
-H header
añade una cabecera
-X METHOD
PUT, PATCH, DELETE…
-u user:pass
autenticación básica
curl -H 'Content-Type: application/json' -d '{"name":"Ada"}' https://api.example.com/users

enviar JSON por POST

curl -H "Authorization: Bearer $TOKEN" https://api.example.com/me

comillas dobles para que $TOKEN se expanda

curl -X DELETE https://api.example.com/users/42

otros métodos

wget

Descargar archivos (con reanudación)

Linux#
wget [options] URL
-c
reanuda una descarga incompleta
-O file
guarda como (usa -O- para la salida estándar)
-q
silencioso
-r -np
recursivo, sin subir nunca al directorio padre
wget -c https://example.com/big.iso

reanudar tras un corte de conexión

wget -qO- https://example.com/data.json | jq .

pasarlo directamente a otro comando

macOS/BSD: No viene en macOS de serie; usa curl -LO (curl -C - -LO para reanudar).

dig

Consultar registros DNS

Linux · macOS#
dig [@server] name [type] [+short]
dig +short example.com

solo los registros A

dig MX example.com

servidores de correo

dig @1.1.1.1 example.com

preguntar a un resolver concreto (sin pasar por la caché local)

dig -x 8.8.8.8

búsqueda inversa

dig +trace example.com

seguir la delegación desde la raíz

Nombre del paquete: dnsutils (Debian/Ubuntu) o bind-utils (Fedora/RHEL).

host / nslookup

Consulta DNS rápida

Linux · macOS#
host name | nslookup name [server]
host example.com

A, AAAA y MX en una respuesta corta

nslookup example.com 8.8.8.8

el mismo comando existe en Windows

resolvectl

Ver los servidores DNS en uso y vaciar la caché DNS

Linux#
resolvectl [status|query|flush-caches]
resolvectl status

servidores DNS por interfaz

sudo resolvectl flush-caches

vaciar la caché de systemd-resolved

macOS/BSD: macOS: sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder.

Solo en sistemas que usan systemd-resolved (Ubuntu y Fedora por defecto).

ping

Comprobar si se puede llegar a un host

Linux · macOS#
ping [-c count] [-i interval] host
-c N
para tras N paquetes
-i sec
intervalo entre paquetes
-4 / -6
fuerza IPv4 / IPv6
ping -c 4 example.com

cuatro paquetes y un resumen

En Linux y macOS, ping sigue hasta que pulsas Ctrl+C, salvo que uses -c (Windows para tras 4). Que no responda no siempre significa que esté caído: muchos hosts bloquean ICMP.

traceroute / tracepath

Ver la ruta que siguen los paquetes hasta un host

Linux · macOS#
traceroute [-n] host | tracepath host
traceroute -n example.com

saltos sin consultas DNS

tracepath example.com

no necesita root y también indica la MTU

macOS/BSD: macOS tiene traceroute pero no tracepath.

En Linux puede que haya que instalar traceroute; tracepath (iputils) suele estar disponible.

mtr

Averiguar dónde se pierden paquetes

Linux#
mtr [-r] [-w] [-c count] host
mtr -rw -c 100 example.com

informe tras 100 sondeos por salto

Combina ping y traceroute. Si la pérdida aparece solo en un salto intermedio, suele ser que ese router da baja prioridad a ICMP; la pérdida que continúa hasta el final es real.

ssh

Iniciar sesión en una máquina remota

Linux · macOS#
ssh [-p port] [-i key] [-J jump] user@host [command]
ssh alice@203.0.113.10

iniciar sesión

ssh -p 2222 alice@host

puerto no estándar

ssh alice@host 'df -h'

ejecutar un comando y volver

ssh -J bastion.example.com alice@10.0.0.5

saltar a través de un host bastión

ssh -L / -R / -D

Reenviar un puerto por SSH (túnel)

Linux · macOS#
ssh -L local:host:remote user@server
-L 5432:localhost:5432
el puerto local 5432 llega al puerto 5432 del servidor
-R 8080:localhost:3000
el puerto 8080 del servidor llega a tu 3000 local
-D 1080
proxy SOCKS en el puerto local 1080
-N
sin comando remoto, solo el túnel
ssh -N -L 5432:localhost:5432 alice@db-host

conectar tu cliente de base de datos local a un Postgres remoto

ssh -N -D 1080 alice@host

navegar a través del servidor

ssh-keygen

Crear una clave SSH e instalarla en un servidor

Linux · macOS#
ssh-keygen -t ed25519 [-C comment] | ssh-copy-id user@host
ssh-keygen -t ed25519 -C "you@example.com"

nuevo par de claves en ~/.ssh

ssh-copy-id alice@host

añadir tu clave pública al authorized_keys del servidor

ssh-keygen -R host

eliminar una clave de host antigua tras reconstruir un servidor ("REMOTE HOST IDENTIFICATION HAS CHANGED")

~/.ssh/config

Guardar la configuración de conexión SSH con un alias corto

Linux · macOS#
Host alias / HostName / User / Port / IdentityFile
Host web
  HostName 203.0.113.10
  User deploy
  Port 2222
  IdentityFile ~/.ssh/id_ed25519

y luego basta con: ssh web (scp y rsync también lo usan)

scp

Copiar archivos a o desde un servidor por SSH

Linux · macOS#
scp [-r] [-P port] source... dest
-r
copia directorios
-P port
puerto (P mayúscula; ssh usa -p minúscula)
-i key
archivo de identidad
scp report.pdf alice@host:/tmp/

subir

scp alice@host:/var/log/app.log .

descargar

scp -r -P 2222 site/ alice@host:~/

subir una carpeta por otro puerto

Desde OpenSSH 9.0, scp usa por debajo el protocolo SFTP. Para copias grandes o repetidas, rsync es más rápido porque solo envía los cambios.

rsync

Sincronizar carpetas en local o por SSH

Linux · macOS#
rsync [-avz] [--progress] [-n] source dest
-a
archivo: recursivo, conserva permisos, fechas y enlaces
-v
detallado
-z
comprime durante la transferencia
-P
muestra el progreso y reanuda archivos incompletos
-n
simulación: muestra lo que pasaría
--exclude 'pattern'
omite archivos
-e 'ssh -p 2222'
opciones de SSH personalizadas
rsync -avzP site/ deploy@host:/srv/site/

la barra final en site/ copia su contenido, no la carpeta en sí

rsync -av --exclude 'node_modules' ./ /backup/app/

copia de seguridad local sin lo que sobra

macOS/BSD: Las versiones recientes de macOS incluyen openrsync en lugar de rsync; las opciones habituales funcionan, algunas menos comunes no.

src/ significa "el contenido de src"; src sin barra significa "la carpeta src". Si te equivocas, acabas con carpetas anidadas (dest/src/…).

rsync --delete

Hacer del destino un espejo exacto

PeligrosoLinux · macOS#
rsync -av --delete source/ dest/
rsync -avn --delete site/ /srv/site/

primero la simulación: las líneas que empiezan por "deleting" muestran lo que se borraría

rsync -av --delete site/ /srv/site/

luego la ejecución real

Peligro: Borra todo lo que hay en el destino y no está en el origen. Intercambiar origen y destino, o una ruta de origen vacía o equivocada, vacía el destino. Ejecútalo siempre antes con -n.

nc

Comprobar si un puerto TCP está abierto

Linux · macOS#
nc -zv host port | nc -l port
nc -zv db.internal 5432

"succeeded" o "Connection refused"/tiempo de espera agotado

nc -l 9000

escuchar en un puerto para probar un firewall desde el otro lado

Las opciones cambian según la variante de netcat: la tradicional necesita nc -l -p 9000.

ufw

Gestionar el firewall en Ubuntu

PeligrosoLinux#
sudo ufw [status|allow|deny|delete|enable]
sudo ufw status verbose

reglas y política predeterminada

sudo ufw allow 22/tcp

permitir SSH (hazlo antes de enable)

sudo ufw allow from 10.0.0.0/8 to any port 5432

un puerto, una red

Peligro: Si ejecutas sudo ufw enable en un servidor remoto sin haber permitido antes SSH (ufw allow OpenSSH o 22/tcp), te quedas fuera.

firewall-cmd

Gestionar el firewall en Fedora/RHEL

Linux#
sudo firewall-cmd [--permanent] --add-service|--add-port ...
sudo firewall-cmd --list-all

zona activa y reglas

sudo firewall-cmd --permanent --add-service=https && sudo firewall-cmd --reload

abrir HTTPS de forma permanente

sudo firewall-cmd --permanent --add-port=8080/tcp

abrir un puerto

Sin --permanent, una regla dura hasta la siguiente recarga o reinicio.

nmcli

Gestionar el wifi y las conexiones (NetworkManager)

Linux#
nmcli [device|connection] ...
nmcli device status

interfaces y si están conectadas

nmcli device wifi list

redes cercanas

nmcli device wifi connect 'MyWiFi' password 'secret'

conectarse a una red

Paquetes: apt, dnf, pacman, zypper

La misma tarea en los cuatro gestores de paquetes principales: Debian/Ubuntu (apt), Fedora/RHEL (dnf), Arch (pacman) y openSUSE (zypper). Antepón sudo a todo lo que modifique el sistema.

Tareaapt (Debian, Ubuntu)dnf (Fedora, RHEL)pacman (Arch)zypper (openSUSE)
Actualizar las listas de paquetes #
dnf las actualiza automáticamente cuando los metadatos están desfasados. En Arch, nunca ejecutes pacman -Sy y después -S pkg: las actualizaciones parciales no están soportadas; usa -Syu.
apt update
dnf makecache
pacman -Sy
zypper refresh
Actualizar todo #
openSUSE Tumbleweed usa zypper dup. apt full-upgrade también elimina paquetes cuando hace falta para completar la actualización.
apt update && apt upgrade
dnf upgrade
pacman -Syu
zypper update
Instalar un paquete #
apt install nginx
dnf install nginx
pacman -S nginx
zypper install nginx
Instalar un archivo de paquete descargado #
El ./ indica a apt que es un archivo, no un nombre de paquete, así que resuelve las dependencias (dpkg -i no lo hace).
apt install ./app.deb
dnf install ./app.rpm
pacman -U app.pkg.tar.zst
zypper install ./app.rpm
Desinstalar un paquete #
apt remove nginx
dnf remove nginx
pacman -R nginx
zypper remove nginx
Desinstalar con archivos de configuración / dependencias sin usar #
apt purge nginx && apt autoremove
dnf remove nginx && dnf autoremove
pacman -Rns nginx
zypper remove --clean-deps nginx
Ver los detalles de un paquete #
apt show nginx
dnf info nginx
pacman -Si nginx (installed: -Qi)
zypper info nginx
Listar los paquetes instalados #
apt list --installed
dnf list --installed
pacman -Q
zypper search --installed-only
Listar las actualizaciones disponibles #
apt list --upgradable
dnf check-update
checkupdates (pacman-contrib)
zypper list-updates
Qué paquete contiene un archivo #
Para archivos que aún no están instalados: dnf provides /path, apt-file search path (requiere apt-file), pacman -F path.
dpkg -S /usr/bin/curl
rpm -qf /usr/bin/curl
pacman -Qo /usr/bin/curl
rpm -qf /usr/bin/curl
Listar los archivos que instaló un paquete #
dpkg -L nginx
rpm -ql nginx
pacman -Ql nginx
rpm -ql nginx
Fijar un paquete en su versión actual #
En DNF 4, versionlock requiere el paquete del plugin versionlock.
apt-mark hold nginx
dnf versionlock add nginx
IgnorePkg = nginx in /etc/pacman.conf
zypper addlock nginx
Vaciar la caché de paquetes #
apt clean
dnf clean all
pacman -Sc
zypper clean

Usuarios y grupos

Quién eres, quién ha iniciado sesión y cómo gestionar cuentas.

whoami / id

Ver tu nombre de usuario, tu UID y tus grupos

Linux · macOS#
whoami | id [user]
id

uid, gid y todos los grupos a los que perteneces

id alice

otro usuario

who / w / last

Ver quién ha iniciado sesión y los inicios de sesión recientes

Linux · macOS#
who | w | last [-n N]
w

quién está conectado y qué está ejecutando

last -n 10

inicios de sesión y reinicios recientes

sudo lastb -n 10

intentos de inicio de sesión fallidos recientes (Linux)

useradd

Crear una cuenta de usuario

Linux#
sudo useradd [-m] [-s shell] [-G groups] user
-m
crea el directorio personal (no es lo predeterminado en todas las distribuciones)
-s /bin/bash
shell de inicio de sesión
-G group1,group2
grupos secundarios
sudo useradd -m -s /bin/bash alice && sudo passwd alice

crearla y asignar una contraseña

En Debian/Ubuntu, adduser alice es el asistente interactivo más amigable, que configura el directorio personal y la contraseña.

usermod -aG

Añadir un usuario a un grupo

PeligrosoLinux#
sudo usermod -aG group user
sudo usermod -aG docker alice

permitir que alice use docker

sudo usermod -aG sudo alice

administrador en Debian/Ubuntu (en Fedora/RHEL/Arch el grupo es wheel)

Peligro: Sin -a, usermod -G reemplaza todos los grupos secundarios del usuario, lo que puede quitarle el acceso a sudo. Los cambios de grupo se aplican en el siguiente inicio de sesión (o ejecuta newgrp docker).

userdel

Eliminar una cuenta de usuario

PeligrosoLinux#
sudo userdel [-r] user
sudo userdel -r olduser

también borra el directorio personal y el buzón de correo

Peligro: -r borra para siempre el directorio personal y sus archivos. Haz antes una copia de seguridad o, en su lugar, bloquea la cuenta (passwd -l).

passwd

Cambiar una contraseña o bloquear una cuenta

Linux#
passwd [user] | passwd -l|-u user
passwd

cambiar la tuya

sudo passwd alice

restablecer la de otra persona

sudo passwd -l alice

bloquear el inicio de sesión con contraseña (las claves SSH pueden seguir funcionando)

groupadd / gpasswd

Crear un grupo o quitar a un usuario de uno

Linux#
sudo groupadd name | sudo gpasswd -d user group
sudo groupadd developers

grupo nuevo

sudo gpasswd -d alice developers

quitar a alice de él

groups / getent

Listar los miembros de un grupo o los grupos de un usuario

Linux#
groups [user] | getent group name
groups alice

los grupos de alice

getent group sudo

miembros de sudo (también funciona con LDAP)

getent passwd alice

entrada de la cuenta: UID, directorio personal, shell

visudo

Dar permisos de sudo a un usuario de forma segura

Linux · macOS#
sudo visudo [-f /etc/sudoers.d/file]
sudo visudo -f /etc/sudoers.d/deploy

un archivo separado por regla

deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart myapp

un comando sin contraseña

visudo comprueba la sintaxis antes de guardar. Editar /etc/sudoers con un editor normal y cometer una errata puede dejar a todo el mundo sin sudo.

chage

Consultar o configurar la caducidad de la contraseña

Linux#
sudo chage [-l] [-M days] user
sudo chage -l alice

fechas del último cambio y de caducidad

sudo chage -M 90 alice

caduca cada 90 días

Archivos comprimidos y compresión

tar, gzip, xz, zip y sumas de comprobación.

tar -c

Crear un archivo .tar.gz

Linux · macOS#
tar -czf archive.tar.gz files...
-c
crear
-z / -j / -J
compresión gzip / bzip2 / xz
-f file
nombre del archivo (ponlo justo después de f)
-v
lista los archivos a medida que se añaden
--exclude='pattern'
deja fuera archivos
tar -czf site-2026-10-18.tar.gz site/

archivo comprimido con gzip de una carpeta

tar -cJf logs.tar.xz --exclude='*.tmp' logs/

archivo xz más pequeño, sin los archivos temporales

tar -x

Extraer un .tar.gz, .tar.xz o .tar.bz2

Linux · macOS#
tar -xf archive [-C dir]
-x
extraer
-C dir
extrae en dir (debe existir)
--strip-components=1
quita la carpeta de primer nivel
tar -xf archive.tar.gz

tar de GNU y tar de macOS detectan la compresión por sí solos

tar -xzf app.tar.gz -C /opt/app --strip-components=1

en una carpeta, sin el directorio contenedor

tar -t

Listar o extraer un solo archivo de un archivo comprimido

Linux · macOS#
tar -tf archive | tar -xf archive path/in/archive
tar -tf backup.tar.gz | less

ver qué contiene sin extraerlo

tar -xf backup.tar.gz etc/nginx/nginx.conf

sacar un archivo (con la ruta que muestra -t)

tar --zstd

Compresión rápida con zstd

Linux · macOS#
tar --zstd -cf archive.tar.zst files...
tar --zstd -cf data.tar.zst data/

mucho más rápido que xz, con una tasa similar a gzip -9 o mejor

zstd -d file.zst

descomprimir un solo archivo

Requiere GNU tar 1.31+ (o un bsdtar reciente) y el programa zstd.

gzip / gunzip

Comprimir o descomprimir un solo archivo

Linux · macOS#
gzip [-k] [-d] [-9] file
-k
conserva el original
-d
descomprime (igual que gunzip)
-9
máxima compresión
gzip -k access.log

crea access.log.gz y conserva el original

zcat access.log.gz | grep 404

leer sin descomprimir en el disco

zgrep 500 access.log.*.gz

buscar con grep directamente en logs rotados

Sin -k, gzip sustituye el archivo por la versión .gz.

xz / bzip2

Más compresión para archivos sueltos

Linux#
xz [-T0] [-9] [-d] file | bzip2 [-d] file
xz -T0 -k big.sql

todos los núcleos de CPU, conservando el original

unxz big.sql.xz

descomprimir

zip

Crear un archivo .zip

Linux · macOS#
zip -r archive.zip files... [-x pattern]
zip -r site.zip site/

comprimir una carpeta en zip

zip -r site.zip site/ -x '*.git*' '*/node_modules/*'

excluir rutas

zip -e cifra con el antiguo esquema ZipCrypto, que es débil. Para una confidencialidad real, usa 7z o gpg.

unzip

Extraer un archivo .zip

Linux · macOS#
unzip [-l] [-o] archive.zip [-d dir]
unzip files.zip -d files/

en una carpeta

unzip -l files.zip

solo listar el contenido

unzip -o files.zip

sobrescribir sin preguntar

7z

Trabajar con archivos .7z (y casi cualquier otro formato)

Linux#
7z a|x|l archive [files]
7z x archive.7z

extraer con las rutas completas

7z a -p backup.7z docs/

archivo cifrado con AES-256 (pide una contraseña)

7z l archive.rar

listar el contenido de muchos formatos

Paquete: p7zip-full / 7zip en Debian/Ubuntu, p7zip o 7zip en Fedora/Arch.

sha256sum

Verificar una descarga con una suma de comprobación

Linux#
sha256sum file | sha256sum -c SUMSFILE
sha256sum ubuntu.iso

compáralo con el hash de la página de descarga

sha256sum -c SHA256SUMS --ignore-missing

comprobar todos los archivos de la lista que realmente tienes

macOS/BSD: macOS: shasum -a 256 file (y shasum -a 256 -c SUMSFILE).

split

Dividir un archivo grande en partes y volver a unirlas

Linux · macOS#
split -b size file prefix
split -b 100M backup.tar.gz backup.part.

backup.part.aa, .ab, …

cat backup.part.* > backup.tar.gz

volver a unirlas

Procesamiento de texto

Corta, filtra, ordena, cuenta, transforma y reestructura texto y JSON.

sed s///

Buscar y reemplazar texto

Linux · macOS#
sed 's/old/new/[g]' file
g
reemplaza todas las coincidencias de la línea, no solo la primera
-E
regex extendida (grupos sin barras invertidas)
I
sin distinguir mayúsculas y minúsculas (GNU)
sed 's/http:/https:/g' links.txt

muestra el resultado; el archivo no cambia

sed 's|/usr/local|/opt|g' paths.txt

cualquier delimitador, útil para rutas

sed -E 's/([0-9]+)px/\1rem/g' style.css

reutilizar un grupo capturado

sed -i

Editar un archivo in situ

Linux · macOS#
sed -i[SUFFIX] 's/old/new/g' file
sed -i 's/^#Port 22/Port 2222/' /etc/ssh/sshd_config

sed de GNU

sed -i.bak 's/foo/bar/g' config.ini

conserva config.ini.bak; funciona en GNU y macOS

macOS/BSD: sed de macOS exige un argumento después de -i: sed -i '' 's/foo/bar/g' file. sed de GNU interpreta '' como el script, así que la única forma que funciona en ambos es -i.bak.

sed -n / d

Mostrar o borrar líneas concretas

Linux · macOS#
sed -n 'Np' | sed '/regex/d'
sed -n '100,120p' big.log

de la línea 100 a la 120

sed '/^\s*#/d; /^$/d' app.conf

quitar comentarios y líneas en blanco (\s de GNU)

sed -n '/BEGIN CERT/,/END CERT/p' bundle.pem

todo lo que hay entre dos marcadores

awk

Mostrar columnas concretas

Linux · macOS#
awk [-F sep] '{print $N}' file
-F sep
separador de campos (por defecto: secuencias de espacios/tabuladores)
$1 … $NF
campos; $NF es el último y $0 la línea entera
NR
número de línea
awk '{print $1}' access.log

primera columna (IP del cliente)

awk -F: '{print $1, $7}' /etc/passwd

usuario y shell

awk -F, 'NR>1 {print $2}' data.csv

segunda columna de un CSV, sin la cabecera (solo CSV sencillos: sin comas entre comillas)

awk (filter & sum)

Filtrar filas y sumar una columna

Linux · macOS#
awk 'condition {action} END {action}' file
awk '$9 >= 500' access.log

líneas en las que el campo 9 (estado) es 5xx

awk '{s += $2} END {print s}' sales.txt

suma de la columna 2

awk '{c[$1]++} END {for (k in c) print c[k], k}' access.log | sort -rn | head

recuento por valor, los 10 primeros

cut

Cortar campos por un delimitador de un solo carácter

Linux · macOS#
cut -d DELIM -f LIST | cut -c RANGE
cut -d, -f1,3 data.csv

columnas 1 y 3

cut -d: -f1 /etc/passwd

todos los nombres de usuario

cut -c1-10 file

los 10 primeros caracteres de cada línea

cut trata cada delimitador como un corte de campo, así que dos espacios equivalen a un campo vacío. Para salidas alineadas con espacios, usa awk.

sort

Ordenar líneas

Linux · macOS#
sort [-n] [-r] [-h] [-k N,N] [-t sep] [-u] file
-n
numérico
-r
orden inverso
-h
tamaños legibles: 2K < 1M < 3G
-k 2,2
ordena solo por el campo 2
-t ,
separador de campos
-u
elimina duplicados
-V
orden de versiones: 1.9 < 1.10
du -sh * | sort -h

carpetas por tamaño

sort -t, -k3,3nr data.csv

CSV por la columna 3, numérico, descendente

sort -u emails.txt > unique.txt

ordenado y sin duplicados

uniq

Contar o eliminar líneas duplicadas

Linux · macOS#
sort file | uniq [-c] [-d] [-u]
-c
antepone a cada línea su número de apariciones
-d
solo las líneas que se repiten
-u
solo las líneas que aparecen una vez
sort ips.txt | uniq -c | sort -rn | head

las 10 líneas más frecuentes

uniq solo agrupa duplicados contiguos, así que ordena primero.

wc

Contar líneas, palabras o bytes

Linux · macOS#
wc [-l] [-w] [-c] [-m] file...
wc -l access.log

número de líneas

ls | wc -l

cuántas entradas hay en esta carpeta

grep -c '' file

recuento de líneas que incluye una última línea sin salto de línea

tr

Sustituir o eliminar caracteres

Linux · macOS#
tr [-d] [-s] 'set1' ['set2']
tr 'a-z' 'A-Z' < in.txt

a mayúsculas

tr -d '\r' < windows.txt > unix.txt

quitar los finales de línea CRLF de Windows

tr -s ' ' < file

reducir los espacios repetidos a uno

tr '\n' ',' < list.txt

unir líneas con comas

tr solo lee la entrada estándar, así que redirige el archivo con <.

xargs

Convertir líneas de entrada en argumentos de un comando

Linux · macOS#
command | xargs [-0] [-n N] [-P N] [-I {}] cmd
-0
la entrada está separada por NUL (combínalo con find -print0); seguro con espacios
-n N
como máximo N argumentos por comando
-P N
ejecuta N comandos en paralelo
-I {}
sustituye {} por cada línea de entrada
-r
no ejecuta el comando si la entrada está vacía (GNU)
find . -name '*.log' -print0 | xargs -0 rm -f

borrar de forma segura los archivos encontrados

cat urls.txt | xargs -n 1 -P 4 curl -sO

descargar 4 a la vez

ls *.png | xargs -I {} cp {} /backup/{}

un comando por elemento

macOS/BSD: xargs de GNU ejecuta el comando una vez aunque la entrada esté vacía, salvo que uses -r; xargs de macOS omite la entrada vacía por defecto y acepta -r por compatibilidad.

jq

Leer y filtrar JSON

Linux · macOS#
jq [-r] 'filter' file
.
formatea de forma legible
-r
cadenas en bruto, sin comillas
-c
compacto, una línea por resultado
.[]
recorre un array
select(cond)
conserva los elementos que coinciden
jq . response.json

formatear de forma legible

jq -r '.items[].name' data.json

un nombre por línea

jq -r '.[] | select(.active) | .email' users.json

filtrar y luego elegir un campo

curl -s https://api.github.com/repos/jqlang/jq | jq '.stargazers_count'

directamente desde una API

Instálalo con apt/dnf install jq. Viene incluido en las versiones recientes de macOS.

paste

Unir líneas o combinar archivos lado a lado

Linux · macOS#
paste [-s] [-d delim] file...
paste -sd, ids.txt

todas las líneas unidas con comas

paste names.txt emails.txt

dos archivos como dos columnas

comm

Líneas comunes a dos listas (o exclusivas de una)

Linux · macOS#
comm [-1] [-2] [-3] sorted1 sorted2
comm -12 <(sort a.txt) <(sort b.txt)

en ambas

comm -23 <(sort a.txt) <(sort b.txt)

solo en a.txt

seq

Generar una secuencia de números

Linux · macOS#
seq [first [step]] last
seq 1 5

del 1 al 5, uno por línea

seq -w 1 10

con ceros a la izquierda: 01 … 10

for i in $(seq 1 3); do echo "run $i"; done

contador de un bucle

base64

Codificar o decodificar Base64

Linux · macOS#
base64 [-d] [-w 0] [file]
printf '%s' 'user:pass' | base64

codificar (printf evita el salto de línea final)

echo dXNlcjpwYXNz | base64 -d

decodificar

base64 -w 0 image.png > image.b64

sin cortes de línea (GNU corta a los 76 caracteres)

macOS/BSD: base64 de macOS no corta las líneas por defecto y no tiene -w. Usa -d para decodificar (las versiones antiguas de macOS usaban -D).

iconv

Convertir la codificación de un texto (p. ej. a UTF-8)

Linux · macOS#
iconv -f FROM -t TO file
iconv -f WINDOWS-1252 -t UTF-8 old.csv > new.csv

arreglar los caracteres extraños de las exportaciones de Excel

iconv -l

listar las codificaciones admitidas

shuf

Barajar líneas o elegir algunas al azar

Linux#
shuf [-n N] file
shuf -n 1 names.txt

una línea al azar

shuf -i 1-100 -n 5

cinco números al azar del 1 al 100

Servicios y logs

Servicios de systemd: iniciar, detener, activar al arrancar y leer sus logs con journalctl.

systemctl status

Comprobar si un servicio está en ejecución

Linux#
systemctl status|is-active|is-enabled unit
systemctl status nginx

estado, PID, memoria y las últimas líneas del log

systemctl is-active --quiet nginx && echo up

para scripts

systemctl start

Iniciar, detener, reiniciar o recargar un servicio

Linux#
sudo systemctl start|stop|restart|reload unit
sudo systemctl restart nginx

reinicio completo

sudo systemctl reload nginx

releer la configuración sin cortar conexiones (si el servicio lo admite)

Siempre que puedas, prueba la configuración antes de reiniciar (p. ej. sudo nginx -t), para que una errata no tumbe el sitio.

systemctl enable

Iniciar un servicio al arrancar (o impedir que se inicie)

Linux#
sudo systemctl enable|disable [--now] unit
sudo systemctl enable --now docker

activar al arrancar e iniciar ya

sudo systemctl disable --now cups

detenerlo ya y al arrancar

sudo systemctl mask bluetooth

impedir que se inicie de ninguna forma (unmask para deshacerlo)

systemctl list-units

Listar los servicios en ejecución y los que han fallado

Linux#
systemctl list-units [--type=service] [--state=…] | systemctl --failed
systemctl --failed

qué ha fallado

systemctl list-units --type=service --state=running

qué se está ejecutando

systemctl list-unit-files --state=enabled

qué se inicia al arrancar

systemctl edit

Modificar una unidad de servicio (y recargar systemd)

Linux#
sudo systemctl edit unit | sudo systemctl daemon-reload
sudo systemctl edit nginx

override que sobrevive a las actualizaciones de paquetes

systemctl cat nginx

la unidad más todos sus overrides

sudo systemctl daemon-reload

necesario tras editar archivos de unidad a mano

.service file

Ejecutar tu propia app como servicio

Linux#
/etc/systemd/system/<name>.service
[Unit]
Description=My app
After=network.target

[Service]
User=app
WorkingDirectory=/srv/app
ExecStart=/srv/app/bin/server
Restart=on-failure

[Install]
WantedBy=multi-user.target

después: sudo systemctl daemon-reload && sudo systemctl enable --now myapp

journalctl

Leer los logs de los servicios y del sistema

Linux#
journalctl [-u unit] [-f] [-n N] [--since …] [-p level] [-b]
-u unit
un servicio
-f
seguir
-n N
las últimas N líneas
--since '1 hour ago'
también: today, yesterday, 2026-10-18 09:00
-p err
prioridad err y superiores
-b / -b -1
este arranque / el arranque anterior
-e
salta al final
journalctl -u nginx -f

seguir un servicio

journalctl -u myapp --since '10 min ago'

ventana reciente

journalctl -b -1 -p err

errores del arranque anterior al fallo

journalctl --vacuum

Reducir el journal de systemd

Linux#
journalctl --disk-usage | sudo journalctl --vacuum-size=SIZE | --vacuum-time=TIME
journalctl --disk-usage

cuánto espacio ocupan los logs

sudo journalctl --vacuum-size=500M

conservar como máximo 500 MB de logs archivados

sudo journalctl --vacuum-time=14d

eliminar los logs archivados de hace más de dos semanas

Para un límite permanente, define SystemMaxUse= en /etc/systemd/journald.conf.

/var/log

Encontrar los archivos de log clásicos

Linux#
sudo tail -f /var/log/<file>
sudo tail -f /var/log/syslog

log general en Debian/Ubuntu (/var/log/messages en Fedora/RHEL)

sudo tail -f /var/log/auth.log

inicios de sesión y sudo en Debian/Ubuntu (/var/log/secure en RHEL)

Algunas distribuciones (Fedora, Arch) solo guardan los logs en el journal, salvo que esté instalado rsyslog.

shutdown / reboot

Reiniciar o apagar

Linux#
sudo shutdown -r|-h [now|+min|hh:mm] [message] | sudo reboot
sudo reboot

reiniciar ya

sudo shutdown -r +10 'Kernel update'

reiniciar en 10 minutos, avisando a los usuarios conectados

sudo shutdown -c

cancelar un apagado programado

sudo shutdown -h now

apagar

Programación de tareas: cron, at, timers

Ejecuta comandos de forma programada o una sola vez más tarde.

cron syntax

Escribir una línea de programación de cron

Linux · macOS#
minute hour day-of-month month day-of-week command
30 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

todos los días a las 02:30, guardando la salida

*/15 * * * * /usr/local/bin/check.sh

cada 15 minutos

0 9 * * 1-5 /usr/local/bin/report.sh

a las 09:00 de lunes a viernes

@reboot /usr/local/bin/startup.sh

una vez al arrancar

cron se ejecuta con un PATH mínimo y sin el perfil del shell: usa rutas absolutas. Un % en el comando debe escaparse como \%.

crontab -r

Eliminar tu crontab (cuidado)

PeligrosoLinux · macOS#
crontab -r
crontab -l > ~/crontab.bak && crontab -r

hacer una copia antes de eliminarlo

crontab ~/crontab.bak

restaurarlo desde un archivo

Peligro: Borra todas tus tareas de cron sin preguntar, y la r está justo al lado de la e en el teclado. Algunas implementaciones de cron ofrecen -i para preguntar antes (crontab -ri).

/etc/cron.d

Tareas de cron de todo el sistema

Linux#
/etc/crontab, /etc/cron.d/*, /etc/cron.{hourly,daily,weekly,monthly}/
0 3 * * * root /usr/local/bin/cleanup.sh

línea en /etc/cron.d/cleanup: fíjate en el campo adicional del usuario

ls /etc/cron.daily/

scripts que run-parts ejecuta una vez al día

En Debian y Ubuntu se ignoran los archivos de /etc/cron.d cuyo nombre contiene un punto, así que llámalo backup, no backup.cron.

at

Ejecutar un comando una sola vez más tarde

Linux#
at TIME | atq | atrm N
echo 'systemctl restart myapp' | sudo at 02:00

esta noche a las 2

echo './report.sh' | at now + 30 minutes

dentro de media hora

atq

tareas pendientes

atrm 3

cancelar la tarea 3

Requiere el paquete at y que el servicio atd esté en ejecución.

systemd timers

Programar con timers de systemd en lugar de cron

Linux#
systemctl list-timers | <name>.timer with OnCalendar=
systemctl list-timers

todos los timers y cuándo se disparan la próxima vez

[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true

[Install]
WantedBy=timers.target

backup.timer junto a backup.service; Persistent recupera las ejecuciones perdidas tras un tiempo apagado

systemd-analyze calendar 'Mon..Fri 09:00'

comprobar qué significa una expresión OnCalendar

sleep

Esperar antes del siguiente comando

Linux · macOS#
sleep N[s|m|h|d]
sleep 5 && curl -s localhost:8080/health

dar tiempo a que arranque un servicio

sleep 2m

los sufijos funcionan en GNU y en las versiones actuales de macOS

Fundamentos del shell (bash)

Tuberías, redirecciones, comodines, variables, historial y las teclas que más tiempo ahorran. macOS usa zsh por defecto: casi todo esto funciona también allí, salvo shopt, help y las funciones de bash 4 (macOS incluye bash 3.2).

|

Pasar la salida de un comando a otro

Linux · macOS#
command1 | command2
ps aux | grep nginx

filtrar un listado

history | grep 'docker run'

encontrar un comando que ejecutaste antes

set -o pipefail

en scripts: una tubería falla si falla cualquier parte, no solo la última

> and >>

Guardar la salida en un archivo (sobrescribiendo o añadiendo)

Linux · macOS#
command > file | command >> file
ls -l > listing.txt

sobrescribir (crea el archivo)

echo 'done' >> progress.log

añadir al final

set -o noclobber

hacer que > se niegue a sobrescribir archivos existentes (>| lo fuerza)

El shell vacía el archivo antes de ejecutar el comando, así que sort file > file te deja un archivo vacío. Escribe en un nombre nuevo y luego usa mv.

2> and 2>&1

Redirigir los errores, o los errores y la salida juntos

Linux · macOS#
command 2> err.log | command > all.log 2>&1 | command &> all.log
find / -name x 2>/dev/null

descartar los mensajes de error

./build.sh > build.log 2>&1

salida y errores en un solo archivo (el orden importa: primero >, luego 2>&1)

./build.sh &> build.log

forma abreviada de bash para lo mismo

<, <<EOF, <<<

Pasar como entrada un archivo, un bloque de texto o una cadena

Linux · macOS#
command < file | command <<'EOF' … EOF | command <<< "string"
mysql mydb < dump.sql

un archivo como entrada

cat > config.yml <<'EOF'
port: 8080
host: $HOST stays literal
EOF

poner 'EOF' entre comillas impide que se expandan las $variables

grep -c a <<< "banana"

here-string

&& || ;

Ejecutar comandos uno tras otro, de forma condicional

Linux · macOS#
a && b | a || b | a ; b
make && sudo make install

instalar solo si la compilación ha ido bien

cd /srv/app || exit 1

detener un script si falla cd

(cd frontend && npm run build)

paréntesis: un subshell, así que tu directorio no cambia

$( ) $(( )) <( )

Usar la salida de un comando o hacer cálculos

Linux · macOS#
$(command) | $((expression)) | <(command)
echo "Today is $(date +%A)"

sustitución de comandos

echo $(( 1024 * 4 ))

aritmética de enteros

diff <(ls dir1) <(ls dir2)

sustitución de procesos: la salida como archivo temporal

Las comillas invertidas `command` son la forma antigua de $(command); $( ) se puede anidar y se lee mejor.

* ? [ ] { }

Seleccionar muchos archivos con comodines

Linux · macOS#
* any string | ? one char | [abc] one of | {a,b} each word
ls *.jpg

todos los JPG de esta carpeta

rm photo-??.png

photo-01.png … photo-99.png

cp config.{yml,yml.bak}

expansión de llaves: cp config.yml config.yml.bak

shopt -s globstar; ls **/*.md

** coincide a cualquier profundidad (bash 4+)

Los comodines no incluyen por defecto los archivos que empiezan por punto (shopt -s dotglob lo cambia). Si nada coincide, bash pasa el patrón literalmente, salvo que esté activado shopt -s nullglob.

' ' vs " "

Entrecomillar cadenas y variables correctamente

Linux · macOS#
'literal' | "expands $var and $(cmd)" | \ escapes one character
echo 'Cost: $5'

comillas simples: no se expande nada

echo "Home is $HOME"

comillas dobles: las variables se expanden y los espacios se conservan

cp "$file" "$dest/"

entrecomilla siempre las variables con rutas: los espacios rompen las que no lo están

VAR=value

Definir y usar variables del shell

Linux · macOS#
name=value (no spaces around =) | "$name" | "${name}"
name="Ada"; echo "Hi $name"

definir y usar

echo "${PORT:-8080}"

valor predeterminado si no está definida o está vacía

file=report.tar.gz; echo "${file%%.*}" "${file##*/}"

quitar la extensión / quitar el directorio

echo "${#name}"

longitud de la cadena

export

Definir variables de entorno

Linux · macOS#
export NAME=value | NAME=value command | unset NAME
export NODE_ENV=production

visible para todos los programas iniciados desde este shell

DEBUG=1 ./app

solo para ese comando

printenv | sort

listarlas

unset DEBUG

eliminar

Se pierden al cerrar el shell. Para conservarlas, pon los export en ~/.bashrc (shells interactivos) o en ~/.profile (shells de inicio de sesión).

$PATH

Añadir una carpeta a tu PATH

Linux · macOS#
export PATH="dir:$PATH"
echo "$PATH" | tr : '\n'

una entrada por línea

export PATH="$HOME/.local/bin:$PATH"

anteponer tu propia carpeta bin (añádelo a ~/.bashrc)

hash -r

olvidar las ubicaciones de comandos en caché tras mover binarios

alias / source

Crear atajos y recargar la configuración del shell

Linux · macOS#
alias name='command' | source file
alias ll='ls -alF'

añádelo a ~/.bashrc para conservarlo

source ~/.bashrc

aplicar los cambios sin abrir otra terminal (igual que . ~/.bashrc)

\ls

ejecutar el ls real, saltándose un alias

$?

Comprobar si el último comando ha funcionado

Linux · macOS#
echo $? (0 = success)
grep -q root /etc/passwd; echo $?

0 encontrado, 1 no encontrado, 2 error

set -euo pipefail

al principio de un script: parar ante errores, variables sin definir y tuberías que fallan

history, !!

Reutilizar comandos anteriores

Linux · macOS#
history | !! | !$ | !N | !prefix | ^old^new
sudo !!

volver a ejecutar el último comando con sudo

cd !$

usar el último argumento del comando anterior

!42

volver a ejecutar la línea 42 del historial

^foo^bar

volver a ejecutar el último comando sustituyendo foo por bar

Con HISTCONTROL=ignorespace (activo por defecto en Ubuntu como parte de ignoreboth), un comando escrito con un espacio delante no se guarda: útil para comandos con secretos.

Ctrl+R, Ctrl+A …

Atajos de teclado de la terminal (bash/readline)

Linux · macOS#
Emacs-style readline keys (the default)
Ctrl+R
busca hacia atrás en el historial; vuelve a pulsar para coincidencias más antiguas
Ctrl+A / Ctrl+E
principio / final de la línea
Ctrl+U / Ctrl+K
corta hasta el principio / hasta el final de la línea
Ctrl+W
corta la palabra anterior
Ctrl+Y
pega lo que has cortado
Alt+B / Alt+F
una palabra atrás / adelante
Alt+.
inserta el último argumento del comando anterior
Ctrl+L
limpia la pantalla
Ctrl+C
cancela el comando en ejecución
Ctrl+D
fin de la entrada; en una línea vacía, cierra el shell
Tab Tab
muestra las opciones de autocompletado
bind -P | less

listar todas las combinaciones de teclas

man / --help

Obtener ayuda sobre cualquier comando

Linux · macOS#
man [section] cmd | cmd --help | help builtin | apropos word
man rsync

manual completo; / para buscar, q para salir

man 5 crontab

sección 5: el formato del archivo, no el comando

help cd

los builtins de bash no tienen página man propia

apropos partition

qué comandos mencionan una palabra

#!/usr/bin/env bash

Escribir y ejecutar un script de shell

Linux · macOS#
#!/usr/bin/env bash, chmod +x, ./script.sh
#!/usr/bin/env bash
set -euo pipefail
name="${1:-world}"
if [[ -f "$name.txt" ]]; then
  echo "found $name.txt"
fi
for f in *.log; do
  echo "$f"
done

argumentos, una comprobación, un bucle

chmod +x script.sh && ./script.sh Ada

hacerlo ejecutable y ejecutarlo

bash -x script.sh

mostrar cada línea a medida que se ejecuta

$1 … $9 son los argumentos, "$@" son todos ellos y $# cuántos hay. [[ ]] es de bash; usa [ ] en scripts POSIX sh.

clear / reset

Limpiar o reparar una terminal descontrolada

Linux · macOS#
clear | reset
reset

cuando, tras hacer cat de un archivo binario, la terminal se queda mostrando basura

Una referencia estática que funciona en tu navegador; tus búsquedas no se envían a ningún sitio. Ver todas las herramientas gratis.

¿Encontraste un problema o algo que podría mejorar? Leemos todos los mensajes y lo arreglamos rápido.

Esta guía rápida de comandos de Linux agrupa más de 200 comandos según la tarea que quieres hacer: moverte y gestionar archivos, permisos, procesos, espacio en disco, redes, paquetes, usuarios, archivos comprimidos, búsquedas, procesamiento de texto, servicios y logs de systemd, cron y los fundamentos de bash que lo unen todo. Cada entrada da la sintaxis, las opciones que de verdad vas a usar con una explicación de una línea, ejemplos para copiar y, cuando importa, un aviso. Busca por tarea (“espacio libre en disco”, “qué está usando el puerto 8080”) o por nombre de comando, y enlaza directamente a cualquier entrada.

Las opciones siguen los manuales de GNU coreutils, util-linux, procps-ng, iproute2, systemd y bash, que es lo que incluyen Ubuntu, Debian, Fedora, RHEL, Arch y openSUSE. Cuando macOS se comporta de otra manera, una nota azul explica cómo, porque sed -i, date -d, stat -c y xargs son los puntos clásicos en los que un script escrito en un sistema falla en el otro. Es una referencia para el 90 % habitual, no un sustituto de las páginas man: para las opciones poco usadas, man <comando> sigue siendo la referencia definitiva.

Cómo usarla

  1. Escribe una tarea o un comando en el cuadro de búsqueda (pulsa / para saltar a él). Tienen que coincidir todas las palabras, así que “tar extract” se limita a las entradas de tar.
  2. Usa las etiquetas de sección para saltar a un tema como Redes o Paquetes, o marca “Solo peligrosos” para ver todos los comandos que pueden destruir datos o dejarte sin acceso.
  3. Haz clic en Copiar junto a cualquier ejemplo y sustituye los nombres de archivo y de host de muestra por los tuyos.
  4. Haz clic en el # junto a una entrada para obtener un enlace directo a ella, por ejemplo /tools/linux-commands-cheat-sheet#rsync.
  5. Usa Imprimir / Guardar como PDF para obtener una copia compacta a dos columnas sin la navegación del sitio.

Preguntas frecuentes

¿Cuáles son los comandos básicos de Linux que hay que aprender primero?

Empieza por la navegación y los archivos: pwd, ls, cd, mkdir, cp, mv, rm, cat y less. Después man (ayuda), sudo, grep y find para buscar, chmod y chown para los permisos, ps, top y kill para los procesos, df y du para el espacio en disco, y ssh y scp para máquinas remotas. Aprende pronto las tuberías (|) y la redirección (> y >>), porque te permiten combinar todo lo demás.

¿Cómo compruebo el espacio en disco en Linux?

Ejecuta df -h para ver el espacio libre de cada sistema de archivos montado en unidades legibles. Para saber qué ocupa el espacio, ejecuta du -h -d 1 | sort -h dentro de un directorio: muestra las subcarpetas con las más grandes al final. Si df dice que el disco está lleno pero du no encuentra nada, probablemente un proceso mantiene abierto un archivo eliminado; sudo lsof +L1 los muestra.

¿Cómo averiguo qué proceso está usando un puerto?

Ejecuta sudo ss -tulpn para ver todos los puertos TCP y UDP en escucha con el programa que los usa, o sudo lsof -i :8080 para un solo puerto. El sudo importa: sin él solo ves los nombres de tus propios procesos. ss sustituyó a netstat, que sigue funcionando en los sistemas que tienen instalado el paquete net-tools.

¿Qué diferencia hay entre kill y kill -9?

kill PID envía SIGTERM, que pide al proceso que termine y le permite hacer limpieza: vaciar archivos, liberar bloqueos, cerrar conexiones. kill -9 PID envía SIGKILL, que el kernel aplica de inmediato y que el proceso no puede capturar ni ignorar, así que no hay limpieza. Usa primero kill a secas, espera unos segundos y reserva -9 para los procesos que lo ignoren.

¿Por qué sed -i no funciona en un Mac?

macOS incluye sed de BSD, donde -i exige un argumento con la extensión de la copia de seguridad. En macOS escribe sed -i '' 's/old/new/g' file; en Linux, con GNU sed, el mismo comando falla porque interpreta '' como el script. La forma que funciona en ambos es sed -i.bak 's/old/new/g' file, que guarda una copia de seguridad que puedes borrar después.

¿Estos comandos son iguales en todas las distribuciones de Linux?

Casi todos sí: las herramientas básicas vienen de los mismos proyectos GNU y util-linux en todas partes. Lo que cambia es el gestor de paquetes (apt en Debian y Ubuntu, dnf en Fedora y RHEL, pacman en Arch, zypper en openSUSE, que aparecen lado a lado en la tabla de Paquetes), algunas rutas de archivos de log, el grupo de administración (sudo frente a wheel) y la interfaz del cortafuegos (ufw frente a firewalld). Alpine y los sistemas basados en BusyBox usan versiones reducidas de las herramientas con menos opciones.

Los comandos que pueden destrozar un sistema y el hábito que lo evita

Una lista corta de comandos causa casi todo el daño: rm -rf con una ruta equivocada o vacía, dd o mkfs apuntando al disco equivocado, chmod -R 777 o chown -R sobre un directorio del sistema, rsync --delete o réplicas al estilo robocopy con el origen y el destino intercambiados, crontab -r en lugar de crontab -e, usermod -G sin -a, y find con -delete en la posición equivocada. Cada uno aparece marcado como Peligroso en la guía rápida, con la forma concreta en que sale mal.

El hábito que evita la mayor parte es ejecutar primero la versión inofensiva. Antes de rm -rf, ejecuta ls sobre la misma ruta. Antes de find … -delete, ejecuta el mismo find con -print. Antes de rsync --delete, añade -n para hacer una simulación. Antes de dd o mkfs, ejecuta lsblk y lee dos veces el nombre del dispositivo. En los scripts, escribe ${DIR:?} en lugar de $DIR para que una variable vacía detenga el script en lugar de convertir una ruta en /.

Dos ajustes de la shell también ayudan: set -euo pipefail al principio de los scripts detiene la ejecución en el primer error en lugar de seguir con un estado incorrecto, y set -o noclobber hace que > se niegue a sobrescribir un archivo existente.

GNU frente a macOS (BSD): donde el mismo comando se comporta distinto

macOS es Unix, pero sus herramientas de línea de comandos vienen de FreeBSD y no de GNU, y las diferencias aparecen justo cuando copias un comando de un tutorial de Linux:

• sed -i necesita un argumento en macOS (sed -i '' …); -i.bak funciona en ambos.

• date no tiene -d en macOS; usa date -r <epoch> para convertir una marca de tiempo y date -v-2d para fechas relativas.

• stat usa -f con otras letras de formato en lugar del -c de GNU.

• xargs en macOS omite por defecto la entrada vacía, mientras que GNU xargs ejecuta el comando una vez salvo que se le pase -r.

• du acepta -d 1 en ambos, pero solo GNU acepta --max-depth; ps no tiene --sort en macOS (usa ps aux -m o -r).

• head -n -5, tac, free, ip, ss, timeout y watch no vienen en macOS de serie.

Si necesitas el comportamiento de GNU en un Mac, los paquetes coreutils, gnu-sed y findutils de Homebrew instalan las versiones GNU con el prefijo g (gsed, gdate, gstat, gxargs).

Cómo leer los permisos y elegir el chmod adecuado

ls -l muestra los permisos como diez caracteres, por ejemplo -rwxr-x---. El primero es el tipo (- archivo, d directorio, l enlace); los nueve siguientes son tres grupos de lectura, escritura y ejecución para el propietario, el grupo y todos los demás. En números, r vale 4, w vale 2 y x vale 1, sumados por grupo, así que rwxr-x--- es 750.

Modos típicos: 644 para archivos normales, 755 para directorios y scripts, 600 para claves privadas y archivos con secretos, 700 para un directorio privado como ~/.ssh. En un directorio, x significa “puede entrar”, por eso los directorios lo necesitan y los archivos normales no. La calculadora de chmod convierte entre la forma simbólica y la octal si quieres comprobar un modo antes de aplicarlo.

Herramientas gratis relacionadas

  • CMD vs PowerShell vs Bash — La misma tarea en el Símbolo del sistema, PowerShell y bash, lado a lado: archivos, grep, variables de entorno, procesos, red, servicios y scripting.
  • Calculadora chmod — Marca las casillas de lectura, escritura y ejecución para obtener el modo octal y el comando chmod, o descifra 755, 644 y rwxr-xr-x.
  • Generador de expresiones cron — Crea una programación cron con menús desplegables o pega una, léela en lenguaje claro y ve las 10 próximas ejecuciones en tu zona horaria y en UTC. Gratis, en tu navegador.
  • Calculadora de subredes — Red, broadcast, rango de hosts y máscara para cualquier CIDR; divide redes con VLSM, expande IPv6 y encuentra rangos que se solapan.
  • Guía rápida de Git — Comandos de Git organizados según lo que quieres hacer: deshacer el último commit, renombrar una rama, eliminar una rama remota. Los comandos modernos switch/restore con sus equivalentes clásicos y avisos de peligro.