- -P
- mostra o caminho físico, com os links simbólicos resolvidos
- -L
- mostra o caminho lógico, mantendo os links simbólicos (padrão)
pwdonde estou?
pwd -Pcaminho real quando você chegou por um link simbólico
Comandos Linux por tarefa, de arquivos e permissões a rede, systemd e processamento de texto. Cada entrada tem opções, exemplos para copiar e notas sobre o macOS.
Última verificação: 2026-10-18, conferido com manuais do GNU coreutils 9.x, util-linux, procps-ng, iproute2, systemd e bash 5.2; notas de macOS conferidas com as man pages do macOS 26.
Leia arquivos, percorra logs, edite no terminal e compare versões.
cat /etc/os-releasemostrar um arquivo
cat part1.txt part2.txt > whole.txtconcatenar
cat -A script.sh | headencontrar tabs ocultos e finais de linha ^M do Windows
macOS/BSD: O cat do macOS não tem -A; use cat -vet para ter a mesma visão.
tac access.log | headlinhas de log mais novas primeiro
macOS/BSD: Não existe no macOS; use tail -r arquivo.
less /var/log/syslogler um log
journalctl -u nginx | less -Slinhas largas sem quebra
head -n 20 data.csvcabeçalho e primeiras linhas
head -c 512 file.bin | xxddar uma olhada no início de um binário
macOS/BSD: O head do macOS não aceita contagens negativas.
tail -n 50 app.logúltimas 50 linhas
tail -F /var/log/nginx/access.logacompanhar um log que sofre rotação
tail -n +2 data.csvpular a linha de cabeçalho de um CSV
sudo nano /etc/hostseditar um arquivo do sistema
A barra de atalhos no rodapé da tela mostra as teclas; ^ significa Ctrl e M- significa Alt.
vim +42 app.pyabrir na linha 42
diff -u old.conf new.confvisão legível das mudanças
diff -rq dir1/ dir2/quais arquivos diferem entre duas árvores
diff <(sort a.txt) <(sort b.txt)comparar depois de ordenar, via substituição de processo
make 2>&1 | tee build.logacompanhar um build e guardar um log
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.confacrescentar a um arquivo do root (sudo echo >> falha porque quem faz o redirecionamento é o shell)
printf '%s\n' "$var"mostrar uma variável com segurança, mesmo que comece com -n
printf '%-12s %6.2f\n' disk 93.5colunas alinhadas
echo -e e echo -n se comportam de forma diferente entre shells; o printf se comporta igual em todos.
column -t -s, data.csv | less -Sler um CSV simples como tabela
mount | column -talinhar saída separada por espaços
xxd image.png | headhex e ASCII lado a lado
hexdump -C file.bin | headdump hexadecimal canônico
O xxd faz parte dos pacotes do vim; o hexdump está no util-linux (bsdextrautils no Debian/Ubuntu mais recentes).
strings -n 8 firmware.bin | lessencontrar strings de versão, URLs, caminhos
Faz parte do binutils no Linux.
Veja e altere quem pode ler, gravar e executar um arquivo.
ls -l deploy.sh-rwxr-x--- 1 alice devs 812 Oct 18 09:12 deploy.sh
O primeiro caractere é o tipo (- arquivo, d diretório, l link simbólico). Depois vêm três trios: dono, grupo, todos os outros. r=4, w=2, x=1, então rwxr-x--- é 750.
chmod 644 index.htmldono lê/grava, todos leem: arquivos comuns
chmod 755 deploy.shdono tudo, outros leem/executam: scripts e diretórios
chmod 600 ~/.ssh/id_ed25519chave privada legível só por você; o ssh recusa chaves mais abertas
chmod +x script.shtornar um script executável
chmod go-w filetirar a gravação do grupo e dos outros
chmod -R u=rwX,go=rX site/o X maiúsculo dá execução só a diretórios e a arquivos que já tinham
find site/ -type d -exec chmod 755 {} +a correção certa, parte 1: diretórios 755
find site/ -type f -exec chmod 644 {} +parte 2: arquivos 644
Perigo: Dá a todos os usuários e a todo serviço comprometido da máquina acesso de gravação à árvore inteira, marca todos os arquivos como executáveis e faz o OpenSSH recusar chaves em um ~/.ssh com 777. Aplicado a /etc ou /usr, pode quebrar o sudo e o sistema. Corrija a propriedade com chown ou use os dois comandos find.
sudo chown -R www-data:www-data /var/www/siteentregar a raiz web ao usuário do servidor web
sudo chown "$USER": file.txtassumir a propriedade de um arquivo criado pelo root
Perigo: sudo chown -R em /, /usr ou /etc apaga os bits setuid e a propriedade de que o sudo, o passwd e os serviços dependem; recuperar costuma significar reinstalar. Confira o caminho duas vezes.
chgrp -R developers /srv/sharedpassar uma pasta compartilhada para o grupo de uma equipe
umaskmostra a máscara atual, normalmente 0022
umask 077arquivos novos 600 e diretórios 700 neste shell
A máscara remove bits: arquivos partem de 666 e diretórios de 777, então 022 dá 644 e 755.
sudo systemctl restart nginxum comando de administrador
sudo !!repetir o comando anterior com sudo
sudo -u postgres psqlexecutar como usuário de serviço
su - deployentrar como deploy com o ambiente dele
sudo su -shell de root quando o root não tem senha (sudo -i faz o mesmo)
setfacl -m u:alice:rw report.xlsxalice pode ler e gravar, sem mudar o grupo
getfacl report.xlsxmostrar todas as entradas
setfacl -R -m g:devs:rwX /srv/appum grupo ganha acesso a uma árvore inteira
Um + no fim da string de permissões do ls -l indica que o arquivo tem ACL.
sudo chattr +i /etc/resolv.confninguém, nem o root, pode alterar ou apagar o arquivo até usar -i
lsattr /etc/resolv.confmostrar atributos; i significa imutável
Funciona em ext4, XFS e Btrfs. Se aparecer "Operation not permitted" mesmo como root, verifique com lsattr.
Descubra o que está rodando, pare e execute coisas em segundo plano.
ps aux | grep [n]ginxo truque do [n] deixa o próprio grep fora dos resultados
ps aux --sort=-%mem | headquem mais usa memória
ps -o pid,ppid,etime,cmd -p 1234há quanto tempo um processo está rodando
macOS/BSD: O ps do macOS não tem --sort; use ps aux -m (por memória) ou ps aux -r (por CPU).
pstree -pcom PIDs
pstree -p 1234o que um processo criou
top -b -n 1 | head -20instantâneo que dá para colar em um chamado
macOS/BSD: O top do macOS é outro programa: ordene com top -o cpu ou top -o mem.
htop -u www-datasó os processos de um usuário
Instale com apt install htop / dnf install htop.
pgrep -a nginxPIDs e linhas de comando
pgrep -f 'python manage.py runserver'encontrar um script pelos argumentos
macOS/BSD: No macOS, -a significa "incluir ancestrais"; use pgrep -lf para ver nomes e argumentos.
pkill -f "node server.js"parar um app Node
pkill -HUP nginxenviar um sinal de recarga
pgrep -af nodever o que o -f pegaria antes de encerrar
Os padrões são expressões regulares procuradas em qualquer parte do nome; pkill node também pega o nodejs-helper. Confira antes com pgrep.
kill 1234parada educada
kill -9 1234último recurso quando o TERM é ignorado
kill %1encerrar o job 1 deste shell
Tente primeiro o kill simples e espere alguns segundos: o -9 pula a limpeza, então arquivos temporários, travas e dados gravados pela metade podem ficar para trás.
killall firefoxtodos os processos do Firefox
No Linux, ele está no pacote psmisc.
jobslistar os jobs deste shell com os números
bg %1retomar o job 1 em segundo plano
fg %1trazê-lo de volta ao primeiro plano
Ctrl+Z suspende o programa em primeiro plano (ele para até você usar bg ou fg).
./long-export.sh > export.log 2>&1 &iniciar e recuperar o prompt
waitem um script, esperar os jobs em segundo plano terminarem
nohup ./server > server.log 2>&1 &sobrevive ao fechamento da sessão SSH
Para qualquer coisa de longa duração, um serviço systemd (veja Serviços e logs) ou o tmux é mais robusto.
disown -h %1esqueceu o nohup: mande para segundo plano com bg e depois use disown
tmux new -s deployiniciar uma sessão com nome
tmux attach -t deployreconectar depois que o SSH cair
Instale pelo gerenciador de pacotes. O GNU screen é a alternativa mais antiga (Ctrl+A d para desanexar, screen -r para reanexar).
nice -n 19 tar -czf backup.tgz /databackup que não atrapalha o resto
sudo renice -n -5 -p 1234aumentar a prioridade de um processo em execução
O valor nice vai de -20 (maior prioridade) a 19 (menor). Só o root pode ir abaixo de 0.
timeout 30s curl -s https://example.com/healthdesistir depois de 30 segundos
timeout -s KILL 5m ./job.shencerramento forçado depois de cinco minutos
Sai com status 124 quando o tempo limite é atingido.
watch -n 2 df -hacompanhar o disco enchendo
watch -d 'ss -s'-d destaca o que mudou
sudo lsof -i :8080o que está escutando na porta 8080
sudo lsof +L1arquivos excluídos ainda abertos (disco cheio, mas o du não mostra nada)
lsof -p 1234todos os arquivos que um processo tem abertos
sudo fuser -vm /mnt/usbpor que o umount diz "target is busy"
sudo fuser -v 8080/tcpprocesso em uma porta TCP
Perigo: fuser -k encerra todos os processos que usam o alvo, sem perguntar; em um ponto de montagem, isso pode incluir o seu próprio shell.
time ./build.shreal = tempo de relógio, user + sys = tempo de CPU
strace -f -e trace=openat ./app 2>&1 | grep -v ENOENTquais arquivos ele realmente abre?
sudo strace -p 1234em que um processo travado está preso?
Versão do SO, kernel, CPU, memória, hardware, hora e carga.
uname -rex.: 6.8.0-45-generic
uname -mqual binário baixar: x86_64 ou aarch64
cat /etc/os-releaseNAME, VERSION_ID, ID em toda distro da era systemd
lsb_release -aalternativa no Debian/Ubuntu, se instalado
macOS/BSD: macOS: sw_vers.
hostnamectlhostname, SO, kernel, virtualização
sudo hostnamectl set-hostname web01renomear a máquina
uptimecarga média em 1, 5 e 15 minutos
A carga é o número de processos rodando ou esperando. Compare com o número de CPUs (nproc): carga 4 em 4 núcleos significa ocupação total.
free -holhe a coluna "available", não "free"
macOS/BSD: macOS: vm_stat, ou top -l 1 | grep PhysMem.
O Linux usa a RAM livre como cache de disco, então "free" parece baixo em uma máquina saudável. "available" é o que os programas ainda podem obter.
lscpumodelo, soquetes, núcleos, threads, flags
make -j"$(nproc)"usar todos os núcleos disponíveis
macOS/BSD: macOS: sysctl -n hw.ncpu e sysctl -n machdep.cpu.brand_string.
lspci -k | grep -A3 -i vgaplaca de vídeo e o driver em uso
lsusbo dispositivo USB foi detectado?
sudo dmidecode -t memory | grep -i sizeRAM instalada por slot
sudo lshw -shortuma linha por dispositivo
sudo dmesg -T | tail -30o que acabou de acontecer (USB conectado, erros de disco)
sudo dmesg -T | grep -i 'out of memory'o OOM killer derrubou seu app?
grep MemAvailable /proc/meminfomemória disponível em kB
grep -c ^processor /proc/cpuinfonúmero de CPUs lógicas
cat /proc/1234/statusestado e memória de um processo
vmstat 1 5r = fila de execução, si/so = swap, wa = espera por E/S
iostat -xz 1utilização por disco (%util) e latência (await)
O iostat vem do pacote sysstat.
date '+%Y-%m-%d %H:%M:%S'timestamp para logs
date +%ssegundos desde 1970-01-01 UTC
date -d @1700000000timestamp para data (GNU)
date -d '2 days ago' +%Fdata relativa (GNU)
macOS/BSD: O date do macOS não tem -d. Use date -r 1700000000 para um timestamp, date -v-2d para "2 dias atrás" e date -j -f '%Y-%m-%d' 2026-10-18 +%s para converter.
timedatectlhora local, UTC, fuso horário, NTP sincronizado?
timedatectl list-timezones | grep Americaencontrar o nome do fuso
sudo timedatectl set-timezone America/Torontoalterá-lo
Espaço livre, o que está ocupando, partições, montagem e formatação.
df -htodos os sistemas de arquivos montados
df -h .o sistema de arquivos em que este diretório está
df -i"No space left" com bytes livres? Talvez tenham acabado os inodes
macOS/BSD: No macOS, -T filtra por tipo em vez de mostrá-lo.
du -sh /var/logtamanho de uma pasta
du -h -d 1 | sort -hsubpastas, a maior por último (funciona no GNU e no macOS)
sudo du -xh -d 1 / | sort -h | tailos maiores diretórios de primeiro nível
macOS/BSD: O du do macOS tem -d, mas não --max-depth.
sudo ncdu -x /navegue com as setas, d para excluir
Instale com apt install ncdu / dnf install ncdu.
lsblkdiscos, partições, tamanhos, pontos de montagem
lsblk -fqual partição é ext4/xfs, e o UUID dela
macOS/BSD: macOS: diskutil list.
sudo blkid /dev/sdb1UUID e TYPE, para o /etc/fstab
findmntárvore de montagem com opções
findmnt -T /var/lib/dockerqual sistema de arquivos contém este caminho
sudo findmnt --verifyverificar erros no /etc/fstab antes de reiniciar
sudo mount /dev/sdb1 /mnt/usbmontar um pendrive (o diretório precisa existir)
sudo mount -o remount,rw /tornar gravável uma raiz somente leitura
sudo mount -t nfs nas:/export /mnt/nasmontar um compartilhamento NFS
sudo umount /mnt/usbdepois disso é seguro desconectar
sudo umount -l /mnt/naslazy: desanexa agora e limpa quando não estiver mais ocupado
"target is busy" significa que um processo (muitas vezes o seu próprio shell parado nesse diretório) está usando o disco: encontre-o com fuser -vm ou lsof.
UUID=3f6c... /data ext4 defaults,nofail 0 2uma linha por sistema de arquivos; nofail deixa a inicialização continuar se o disco estiver ausente
sudo mount -amontar agora tudo o que está no fstab: teste antes de reiniciar
Um erro de digitação no fstab pode fazer a próxima inicialização cair no modo de emergência. Sempre rode sudo mount -a (ou findmnt --verify) depois de editar.
sudo fdisk -ltodos os discos e as partições deles
sudo parted /dev/sdb printtipo de tabela de partição (gpt/msdos) e layout
Perigo: Gravar uma tabela de partição (w no fdisk, mklabel no parted) torna inacessíveis os dados existentes nesse disco. Confirme o nome do dispositivo com lsblk antes; /dev/sda e /dev/sdb trocam de lugar com facilidade.
sudo mkfs.ext4 -L data /dev/sdb1ext4 com rótulo
sudo mkfs.vfat -F 32 /dev/sdc1FAT32 para um pendrive que outros dispositivos consigam ler
Perigo: Apaga o sistema de arquivos do alvo na hora, sem confirmação se o dispositivo não estiver montado. Confira o dispositivo com lsblk -f; formatar /dev/sda em vez de /dev/sda1, ou o disco errado, o destrói.
sudo fsck -f /dev/sdb1forçar uma verificação completa de uma partição desmontada
Perigo: Nunca rode fsck em um sistema de arquivos montado para leitura e gravação: ele pode corrompê-lo. Desmonte antes ou, para o sistema de arquivos raiz, inicie por uma mídia de recuperação.
sudo dd if=ubuntu.iso of=/dev/sdX bs=4M status=progress conv=fsynccriar um pendrive inicializável (troque sdX pelo disco inteiro, não por uma partição)
dd if=/dev/zero of=test.img bs=1M count=100criar um arquivo de 100 MB
Perigo: O dd sobrescreve o alvo of= sem perguntar. Inverter if= e of=, ou escolher o /dev/sdX errado, apaga esse disco. Confira com lsblk logo antes de rodar.
macOS/BSD: macOS: use como alvo /dev/rdiskN (do diskutil list) depois de diskutil unmountDisk, use bs=4m e pressione Ctrl+T para ver o progresso.
sync && sudo umount /mnt/usbantes de tirar um pendrive
swapon --showswap atual
sudo fallocate -l 2G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfileadicionar um arquivo de swap de 2 GB (adicione-o ao /etc/fstab para mantê-lo)
No Btrfs, um arquivo de swap exige passos extras (btrfs filesystem mkswapfile nas versões recentes do btrfs-progs).
shred -u -n 3 secrets.txtsobrescrever três vezes e depois excluir
Perigo: Irreversível. Também não é confiável em SSDs, em sistemas de arquivos com journaling ou copy-on-write (Btrfs, ZFS) nem em nada com snapshots; para proteção real, use criptografia de disco inteiro.
Endereços IP, rotas, portas abertas, requisições HTTP, DNS, SSH e transferência de arquivos.
ip -br auma linha por interface: nome, estado, endereços
ip a show eth0uma interface em detalhe
hostname -Isó os endereços IP
macOS/BSD: macOS: ifconfig, ou ipconfig getifaddr en0.
O ip substitui o antigo ifconfig (net-tools), que muitas distribuições não instalam mais.
ip rrotas; "default via" é o gateway
ip route get 1.1.1.1qual interface e gateway um destino usa
sudo ip route add 10.20.0.0/16 via 192.168.1.1adicionar uma rota (perdida ao reiniciar)
ip linkinterfaces e endereços MAC
sudo ip link set eth0 down && sudo ip link set eth0 upreiniciar uma interface
Perigo: Desativar a interface pela qual você está conectado via SSH derruba a sua sessão.
sudo ss -tulpntodas as portas em escuta e os programas delas
ss -tn state established '( dport = :443 )'conexões estabelecidas com a porta 443
ss -stotais de conexões
macOS/BSD: macOS: lsof -iTCP -sTCP:LISTEN -n -P, ou netstat -an.
O ss substitui o netstat; netstat -tulpn ainda funciona onde o net-tools está instalado.
curl -I https://example.comlinha de status e cabeçalhos
curl -LO https://example.com/file.tar.gzbaixar, seguindo redirecionamentos
curl -s -o /dev/null -w '%{http_code}\n' https://example.comsó o código de status
curl -fsSL https://example.com/install.sh -o install.shbaixar um script para ler antes de rodar
curl -H 'Content-Type: application/json' -d '{"name":"Ada"}' https://api.example.com/usersPOST de JSON
curl -H "Authorization: Bearer $TOKEN" https://api.example.com/measpas duplas para o $TOKEN ser expandido
curl -X DELETE https://api.example.com/users/42outros métodos
wget -c https://example.com/big.isoretomar depois que a conexão cair
wget -qO- https://example.com/data.json | jq .mandar direto para outro comando
macOS/BSD: Não vem no macOS padrão; use curl -LO (curl -C - -LO para retomar).
dig +short example.comsó os registros A
dig MX example.comservidores de e-mail
dig @1.1.1.1 example.comperguntar a um resolvedor específico (ignora o cache local)
dig -x 8.8.8.8consulta reversa
dig +trace example.comseguir a delegação a partir da raiz
Nome do pacote: dnsutils (Debian/Ubuntu) ou bind-utils (Fedora/RHEL).
host example.comA, AAAA e MX em uma resposta curta
nslookup example.com 8.8.8.8o mesmo comando existe no Windows
resolvectl statusservidores DNS por interface
sudo resolvectl flush-cacheslimpar o cache do systemd-resolved
macOS/BSD: macOS: sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder.
Só em sistemas que usam systemd-resolved (Ubuntu e Fedora por padrão).
ping -c 4 example.comquatro pacotes e depois um resumo
No Linux e no macOS, o ping roda até Ctrl+C, a menos que você use -c (o Windows para depois de 4). Sem resposta nem sempre significa fora do ar: muitos hosts bloqueiam ICMP.
traceroute -n example.comsaltos sem consultas DNS
tracepath example.comnão precisa de root e também informa o MTU
macOS/BSD: O macOS tem traceroute, mas não tracepath.
O traceroute pode precisar ser instalado no Linux; o tracepath (iputils) normalmente já está lá.
mtr -rw -c 100 example.comrelatório depois de 100 sondagens por salto
Combina ping e traceroute. Perda só em um salto intermediário costuma ser aquele roteador dando baixa prioridade ao ICMP; perda que continua até o fim é real.
ssh alice@203.0.113.10entrar
ssh -p 2222 alice@hostporta não padrão
ssh alice@host 'df -h'executar um comando e voltar
ssh -J bastion.example.com alice@10.0.0.5passar por um bastion host
ssh -N -L 5432:localhost:5432 alice@db-hostconectar o seu cliente de banco local a um Postgres remoto
ssh -N -D 1080 alice@hostnavegar através do servidor
ssh-keygen -t ed25519 -C "you@example.com"novo par de chaves em ~/.ssh
ssh-copy-id alice@hostacrescentar sua chave pública ao authorized_keys do servidor
ssh-keygen -R hostremover uma chave de host antiga depois de recriar o servidor ("REMOTE HOST IDENTIFICATION HAS CHANGED")
Host web
HostName 203.0.113.10
User deploy
Port 2222
IdentityFile ~/.ssh/id_ed25519depois é só: ssh web (o scp e o rsync também usam)
scp report.pdf alice@host:/tmp/enviar
scp alice@host:/var/log/app.log .baixar
scp -r -P 2222 site/ alice@host:~/enviar uma pasta por outra porta
Desde o OpenSSH 9.0, o scp usa o protocolo SFTP por baixo. Para cópias grandes ou repetidas, o rsync é mais rápido porque envia só as mudanças.
rsync -avzP site/ deploy@host:/srv/site/a barra no fim de site/ copia o conteúdo, não a própria pasta
rsync -av --exclude 'node_modules' ./ /backup/app/backup local sem o lixo
macOS/BSD: O macOS recente traz o openrsync em vez do rsync; as flags comuns funcionam, algumas mais raras não.
src/ significa "o conteúdo de src"; src sem barra significa "a pasta src". Errar isso aninha as pastas (dest/src/…).
rsync -avn --delete site/ /srv/site/simulação primeiro: as linhas que começam com "deleting" mostram o que seria apagado
rsync -av --delete site/ /srv/site/depois a execução real
Perigo: Apaga tudo em dest que não está na origem. Inverter origem e destino, ou um caminho de origem vazio/errado, apaga o destino. Sempre rode com -n primeiro.
nc -zv db.internal 5432"succeeded" ou "Connection refused"/timeout
nc -l 9000escutar em uma porta para testar um firewall do outro lado
As flags variam entre as versões do netcat: a tradicional precisa de nc -l -p 9000.
sudo ufw status verboseregras e política padrão
sudo ufw allow 22/tcpliberar o SSH (faça isso antes do enable)
sudo ufw allow from 10.0.0.0/8 to any port 5432uma porta, uma rede
Perigo: sudo ufw enable em um servidor remoto sem antes liberar o SSH (ufw allow OpenSSH ou 22/tcp) deixa você trancado do lado de fora.
sudo firewall-cmd --list-allzona ativa e regras
sudo firewall-cmd --permanent --add-service=https && sudo firewall-cmd --reloadabrir o HTTPS de forma permanente
sudo firewall-cmd --permanent --add-port=8080/tcpabrir uma porta
Sem --permanent, uma regra dura até o próximo reload ou reinício.
nmcli device statusinterfaces e se estão conectadas
nmcli device wifi listredes próximas
nmcli device wifi connect 'MyWiFi' password 'secret'entrar em uma rede
A mesma tarefa nos quatro principais gerenciadores de pacotes: Debian/Ubuntu (apt), Fedora/RHEL (dnf), Arch (pacman), openSUSE (zypper). Use sudo antes de tudo o que altera o sistema.
| Tarefa | apt (Debian, Ubuntu) | dnf (Fedora, RHEL) | pacman (Arch) | zypper (openSUSE) |
|---|---|---|---|---|
| Atualizar as listas de pacotes # O dnf atualiza automaticamente quando os metadados estão desatualizados. No Arch, nunca rode pacman -Sy seguido de -S pacote: atualizações parciais não são suportadas; use -Syu. | apt update | dnf makecache | pacman -Sy | zypper refresh |
| Atualizar tudo # O openSUSE Tumbleweed usa zypper dup. O apt full-upgrade também remove pacotes quando necessário para concluir a atualização. | apt update && apt upgrade | dnf upgrade | pacman -Syu | zypper update |
| Instalar um pacote # | apt install nginx | dnf install nginx | pacman -S nginx | zypper install nginx |
| Instalar um arquivo de pacote baixado # O ./ indica ao apt que é um arquivo, não um nome de pacote, e assim as dependências são resolvidas (o dpkg -i não faz isso). | apt install ./app.deb | dnf install ./app.rpm | pacman -U app.pkg.tar.zst | zypper install ./app.rpm |
| Remover um pacote # | apt remove nginx | dnf remove nginx | pacman -R nginx | zypper remove nginx |
| Remover com arquivos de configuração / dependências não usadas # | apt purge nginx && apt autoremove | dnf remove nginx && dnf autoremove | pacman -Rns nginx | zypper remove --clean-deps nginx |
| Procurar um pacote # | apt search keyword | dnf search keyword | pacman -Ss keyword | zypper search keyword |
| Mostrar detalhes do pacote # | apt show nginx | dnf info nginx | pacman -Si nginx (installed: -Qi) | zypper info nginx |
| Listar pacotes instalados # | apt list --installed | dnf list --installed | pacman -Q | zypper search --installed-only |
| Listar atualizações disponíveis # | apt list --upgradable | dnf check-update | checkupdates (pacman-contrib) | zypper list-updates |
| Qual pacote é dono de um arquivo # Para arquivos ainda não instalados: dnf provides /caminho, apt-file search caminho (precisa do apt-file), pacman -F caminho. | dpkg -S /usr/bin/curl | rpm -qf /usr/bin/curl | pacman -Qo /usr/bin/curl | rpm -qf /usr/bin/curl |
| Listar os arquivos que um pacote instalou # | dpkg -L nginx | rpm -ql nginx | pacman -Ql nginx | rpm -ql nginx |
| Travar um pacote na versão atual # No DNF 4, o versionlock precisa do pacote do plugin versionlock. | apt-mark hold nginx | dnf versionlock add nginx | IgnorePkg = nginx in /etc/pacman.conf | zypper addlock nginx |
| Limpar o cache de pacotes # | apt clean | dnf clean all | pacman -Sc | zypper clean |
Quem é você, quem está conectado e gerenciamento de contas.
iduid, gid e todos os grupos a que você pertence
id aliceoutro usuário
wquem está conectado e o que está executando
last -n 10logins e reinicializações recentes
sudo lastb -n 10tentativas de login recentes que falharam (Linux)
sudo useradd -m -s /bin/bash alice && sudo passwd alicecriar e definir uma senha
No Debian/Ubuntu, adduser alice é a alternativa interativa mais amigável, que configura o diretório pessoal e a senha.
sudo usermod -aG docker alicedeixar a alice usar o docker
sudo usermod -aG sudo aliceadministrador no Debian/Ubuntu (no Fedora/RHEL/Arch o grupo é wheel)
Perigo: Sem -a, usermod -G substitui todos os grupos suplementares do usuário, o que pode tirar o acesso ao sudo. Mudanças de grupo valem no próximo login (ou rode newgrp docker).
sudo userdel -r oldusertambém remove o diretório pessoal e a caixa de e-mail
Perigo: -r apaga o diretório pessoal e os arquivos dele para sempre. Faça backup antes ou, em vez disso, bloqueie a conta (passwd -l).
passwdmudar a sua
sudo passwd aliceredefinir a de outra pessoa
sudo passwd -l alicebloquear o login por senha (chaves SSH ainda podem funcionar)
sudo groupadd developersnovo grupo
sudo gpasswd -d alice developerstirar a alice dele
groups alicegrupos da alice
getent group sudomembros do sudo (também funciona com LDAP)
getent passwd aliceentrada da conta: UID, diretório pessoal, shell
sudo visudo -f /etc/sudoers.d/deployum arquivo separado por regra
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart myappum comando sem senha
O visudo verifica a sintaxe antes de salvar. Editar o /etc/sudoers com um editor comum e cometer um erro de digitação pode deixar todo mundo sem sudo.
sudo chage -l alicedatas da última troca e da expiração
sudo chage -M 90 aliceexpirar a cada 90 dias
tar, gzip, xz, zip e checksums.
tar -czf site-2026-10-18.tar.gz site/arquivo compactado com gzip de uma pasta
tar -cJf logs.tar.xz --exclude='*.tmp' logs/arquivo xz menor, sem os temporários
tar -xf archive.tar.gzo tar do GNU e o do macOS detectam a compressão sozinhos
tar -xzf app.tar.gz -C /opt/app --strip-components=1para uma pasta, sem o diretório que embrulha tudo
tar -tf backup.tar.gz | lessver o que há dentro sem extrair
tar -xf backup.tar.gz etc/nginx/nginx.conftirar um arquivo (caminho como mostrado por -t)
tar --zstd -cf data.tar.zst data/bem mais rápido que o xz, taxa parecida ou melhor que gzip -9
zstd -d file.zstdescompactar um único arquivo
Precisa do GNU tar 1.31+ (ou de um bsdtar recente) e do programa zstd.
gzip -k access.logcria access.log.gz e mantém o original
zcat access.log.gz | grep 404ler sem descompactar no disco
zgrep 500 access.log.*.gzfazer grep direto em logs rotacionados
Sem -k, o gzip substitui o arquivo pela versão .gz.
xz -T0 -k big.sqltodos os núcleos da CPU, mantendo o original
unxz big.sql.xzdescompactar
zip -r site.zip site/compactar uma pasta
zip -r site.zip site/ -x '*.git*' '*/node_modules/*'excluir caminhos
zip -e criptografa com o esquema antigo ZipCrypto, que é fraco. Use 7z ou gpg para sigilo de verdade.
unzip files.zip -d files/para uma pasta
unzip -l files.zipsó listar o conteúdo
unzip -o files.zipsobrescrever sem perguntar
7z x archive.7zextrair com os caminhos completos
7z a -p backup.7z docs/arquivo criptografado com AES-256 (pede uma senha)
7z l archive.rarlistar o conteúdo de vários formatos
Pacote: p7zip-full / 7zip no Debian/Ubuntu, p7zip ou 7zip no Fedora/Arch.
sha256sum ubuntu.isocomparar com o hash da página de download
sha256sum -c SHA256SUMS --ignore-missingconferir todos os arquivos listados que você realmente tem
macOS/BSD: macOS: shasum -a 256 arquivo (e shasum -a 256 -c ARQUIVO_DE_SOMAS).
split -b 100M backup.tar.gz backup.part.backup.part.aa, .ab, …
cat backup.part.* > backup.tar.gzjuntá-las de novo
Encontre arquivos por nome, idade ou tamanho, e texto dentro de arquivos.
find . -name '*.log'coloque o padrão entre aspas para o shell não expandi-lo antes
find / -iname 'nginx.conf' 2>/dev/nullprocurar em tudo, escondendo erros de permissão
find . -maxdepth 1 -type dsubdiretórios imediatos
find . -type l -xtype llinks simbólicos quebrados (GNU)
find . -type f -emptyarquivos vazios
find /var/log -type f -mtime +30logs com mais de 30 dias
find . -type f -mmin -15o que mudou nos últimos 15 minutos
sudo find / -xdev -type f -size +500M -exec ls -lh {} + 2>/dev/nullarquivos com mais de 500 MB no sistema de arquivos raiz
find . -name '*.sh' -exec chmod +x {} +{} + passa vários arquivos por comando (rápido)
find . -name '*.py' -exec grep -l 'TODO' {} +quais arquivos Python contêm TODO
find . -name '*.jpg' -print0 | xargs -0 -P4 -n 20 jpegoptimprocessamento em paralelo, seguro com espaços nos nomes
find /tmp/app -name '*.tmp' -mtime +7 -printpasso 1: listar o que corresponde
find /tmp/app -name '*.tmp' -mtime +7 -deletepasso 2: o mesmo comando com -delete no fim
Perigo: A ordem importa: -delete age onde quer que apareça, então find . -delete -name "*.tmp" apaga tudo dentro de . antes de o teste de nome ser aplicado. Coloque -delete por último e rode com -print primeiro.
find /srv -type f -perm -o+warquivos graváveis por todos
sudo find / -xdev -perm -4000 -type f 2>/dev/nullprogramas com setuid
locate -i nginx.confmuito mais rápido que find /
sudo updatedbatualizar o índice agora
Fornecido pelo plocate ou mlocate; o índice é refeito diariamente, então arquivos criados hoje podem faltar até o updatedb rodar.
grep -n 'ERROR' app.loglinhas correspondentes com números
grep -v '^#' nginx.conf | grep -v '^$'configuração sem comentários nem linhas em branco
grep -c 'Failed password' /var/log/auth.logcontar logins SSH que falharam
grep -rn 'TODO' src/todos os TODO com arquivo e linha
grep -rl --include='*.php' 'mysql_connect' .quais arquivos PHP ainda usam uma API antiga
grep -rn --exclude-dir={.git,node_modules} 'apiKey' .ignorar pastas barulhentas
grep -C 3 'Traceback' app.log3 linhas antes e depois
grep -A 20 'Exception' app.logo stack trace depois do erro
grep -E 'error|warn' app.logqualquer uma das palavras (regex estendida)
grep -Eo '[0-9]{1,3}(\.[0-9]{1,3}){3}' access.log | sort | uniq -c | sort -rn | headprincipais endereços IP em um log
grep -P '\d{4}-\d{2}-\d{2}' file\d no estilo Perl (grep do GNU)
macOS/BSD: -E funciona em todo lugar; -P (PCRE) é um recurso do GNU e não está disponível em todas as versões do macOS.
type lldiz se é alias, função, builtin ou arquivo
command -v docker >/dev/null || echo "docker missing"verificação portável em scripts
which -a python3todos os python3 do PATH, em ordem
Corte, filtre, ordene, conte, transforme e reorganize texto e JSON.
sed 's/http:/https:/g' links.txtmostra o resultado; o arquivo não muda
sed 's|/usr/local|/opt|g' paths.txtqualquer delimitador, útil para caminhos
sed -E 's/([0-9]+)px/\1rem/g' style.cssreaproveitar um grupo capturado
sed -i 's/^#Port 22/Port 2222/' /etc/ssh/sshd_configsed do GNU
sed -i.bak 's/foo/bar/g' config.inimantém config.ini.bak; funciona no GNU e no macOS
macOS/BSD: O sed do macOS exige um argumento depois de -i: sed -i '' 's/foo/bar/g' arquivo. O sed do GNU lê '' como o script, então a única forma que funciona nos dois é -i.bak.
sed -n '100,120p' big.loglinhas 100 a 120
sed '/^\s*#/d; /^$/d' app.confremover comentários e linhas em branco (\s do GNU)
sed -n '/BEGIN CERT/,/END CERT/p' bundle.pemtudo entre dois marcadores
awk '{print $1}' access.logprimeira coluna (IP do cliente)
awk -F: '{print $1, $7}' /etc/passwdusuário e shell
awk -F, 'NR>1 {print $2}' data.csvsegunda coluna de um CSV, sem o cabeçalho (só CSV simples: sem vírgulas entre aspas)
awk '$9 >= 500' access.loglinhas em que o campo 9 (status) é 5xx
awk '{s += $2} END {print s}' sales.txtsoma da coluna 2
awk '{c[$1]++} END {for (k in c) print c[k], k}' access.log | sort -rn | headcontagem por valor, os 10 primeiros
cut -d, -f1,3 data.csvcolunas 1 e 3
cut -d: -f1 /etc/passwdtodos os nomes de usuário
cut -c1-10 fileos 10 primeiros caracteres de cada linha
O cut trata cada delimitador como quebra de campo, então dois espaços significam um campo vazio. Para saída alinhada com espaços, use awk.
du -sh * | sort -hpastas por tamanho
sort -t, -k3,3nr data.csvCSV pela coluna 3, numérico, decrescente
sort -u emails.txt > unique.txtordenado e sem duplicatas
sort ips.txt | uniq -c | sort -rn | headas 10 linhas mais frequentes
O uniq só junta duplicatas adjacentes, então ordene antes.
wc -l access.lognúmero de linhas
ls | wc -lquantas entradas há nesta pasta
grep -c '' filecontagem de linhas que inclui uma última linha sem quebra de linha
tr 'a-z' 'A-Z' < in.txtmaiúsculas
tr -d '\r' < windows.txt > unix.txtremover finais de linha CRLF do Windows
tr -s ' ' < filejuntar espaços repetidos
tr '\n' ',' < list.txtjuntar linhas com vírgulas
O tr só lê a entrada padrão, então redirecione o arquivo com <.
find . -name '*.log' -print0 | xargs -0 rm -fexcluir com segurança os arquivos encontrados
cat urls.txt | xargs -n 1 -P 4 curl -sObaixar 4 de cada vez
ls *.png | xargs -I {} cp {} /backup/{}um comando por item
macOS/BSD: O xargs do GNU executa o comando uma vez mesmo com entrada vazia, a menos que você use -r; o xargs do macOS ignora entrada vazia por padrão e aceita -r por compatibilidade.
jq . response.jsonformatar de forma legível
jq -r '.items[].name' data.jsonum nome por linha
jq -r '.[] | select(.active) | .email' users.jsonfiltrar e depois escolher um campo
curl -s https://api.github.com/repos/jqlang/jq | jq '.stargazers_count'direto de uma API
Instale com apt/dnf install jq. Vem com o macOS recente.
paste -sd, ids.txttodas as linhas unidas com vírgulas
paste names.txt emails.txtdois arquivos como duas colunas
comm -12 <(sort a.txt) <(sort b.txt)nas duas
comm -23 <(sort a.txt) <(sort b.txt)só em a.txt
seq 1 5de 1 a 5, um por linha
seq -w 1 10com zeros à esquerda: 01 … 10
for i in $(seq 1 3); do echo "run $i"; donecontador de loop
printf '%s' 'user:pass' | base64codificar (o printf evita a quebra de linha no fim)
echo dXNlcjpwYXNz | base64 -ddecodificar
base64 -w 0 image.png > image.b64sem quebra de linha (o GNU quebra a cada 76 caracteres)
macOS/BSD: O base64 do macOS não quebra linhas por padrão e não tem -w. Use -d para decodificar (o macOS antigo usava -D).
iconv -f WINDOWS-1252 -t UTF-8 old.csv > new.csvcorrigir caracteres embaralhados em exportações do Excel
iconv -llistar as codificações suportadas
shuf -n 1 names.txtuma linha aleatória
shuf -i 1-100 -n 5cinco números aleatórios de 1 a 100
Serviços do systemd: iniciar, parar, ativar na inicialização e ler os logs com journalctl.
systemctl status nginxestado, PID, memória e as últimas linhas de log
systemctl is-active --quiet nginx && echo uppara scripts
sudo systemctl restart nginxreinício completo
sudo systemctl reload nginxreler a configuração sem derrubar conexões (se o serviço suportar)
Teste a configuração antes de reiniciar quando possível, ex.: sudo nginx -t, para que um erro de digitação não derrube o site.
sudo systemctl enable --now dockerativar na inicialização e iniciar agora
sudo systemctl disable --now cupsparar agora e na inicialização
sudo systemctl mask bluetoothimpedir totalmente que ele seja iniciado (unmask para desfazer)
systemctl --failedo que quebrou
systemctl list-units --type=service --state=runningo que está rodando
systemctl list-unit-files --state=enabledo que inicia com o sistema
sudo systemctl edit nginxoverride drop-in que sobrevive às atualizações do pacote
systemctl cat nginxa unit mais todos os overrides
sudo systemctl daemon-reloadnecessário depois de editar arquivos de unit à mão
[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.targetdepois: sudo systemctl daemon-reload && sudo systemctl enable --now myapp
journalctl -u nginx -facompanhar um serviço
journalctl -u myapp --since '10 min ago'janela recente
journalctl -b -1 -p errerros da inicialização anterior ao travamento
journalctl --disk-usagequanto espaço os logs ocupam
sudo journalctl --vacuum-size=500Mmanter no máximo 500 MB de logs arquivados
sudo journalctl --vacuum-time=14ddescartar logs arquivados com mais de duas semanas
Para um limite permanente, defina SystemMaxUse= em /etc/systemd/journald.conf.
sudo tail -f /var/log/sysloglog geral no Debian/Ubuntu (/var/log/messages no Fedora/RHEL)
sudo tail -f /var/log/auth.loglogins e sudo no Debian/Ubuntu (/var/log/secure no RHEL)
Algumas distribuições (Fedora, Arch) guardam os logs só no journal, a menos que o rsyslog esteja instalado.
sudo rebootreiniciar agora
sudo shutdown -r +10 'Kernel update'reiniciar em 10 minutos, avisando os usuários conectados
sudo shutdown -ccancelar um desligamento agendado
sudo shutdown -h nowdesligar
Execute comandos em um horário programado ou uma vez mais tarde.
crontab -eabrir o seu crontab no $EDITOR
crontab -llistá-lo
crontab -l > crontab.bakfazer backup
Monte e entenda o agendamento no gerador de expressões cron →
30 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1todo dia às 02:30, guardando a saída
*/15 * * * * /usr/local/bin/check.sha cada 15 minutos
0 9 * * 1-5 /usr/local/bin/report.sh09:00 de segunda a sexta
@reboot /usr/local/bin/startup.shuma vez na inicialização
O cron roda com um PATH mínimo e sem o perfil do shell: use caminhos absolutos. Um % no comando precisa ser escapado como \%.
crontab -l > ~/crontab.bak && crontab -rfazer backup antes de remover
crontab ~/crontab.bakrestaurar a partir de um arquivo
Perigo: Apaga todos os seus jobs do cron sem perguntar, e o r fica bem ao lado do e no teclado. Algumas implementações do cron oferecem -i para perguntar antes (crontab -ri).
0 3 * * * root /usr/local/bin/cleanup.shlinha em /etc/cron.d/cleanup: repare no campo extra de usuário
ls /etc/cron.daily/scripts executados uma vez por dia pelo run-parts
No Debian e no Ubuntu, arquivos em /etc/cron.d cujo nome contém ponto são ignorados; então chame de backup, não de backup.cron.
echo 'systemctl restart myapp' | sudo at 02:00hoje às 2 da manhã
echo './report.sh' | at now + 30 minutesdaqui a meia hora
atqjobs pendentes
atrm 3cancelar o job 3
Precisa do pacote at e do serviço atd rodando.
systemctl list-timerstodos os timers e quando disparam de novo
[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true
[Install]
WantedBy=timers.targetbackup.timer ao lado do backup.service; Persistent recupera execuções perdidas com a máquina desligada
systemd-analyze calendar 'Mon..Fri 09:00'ver o que significa uma expressão OnCalendar
sleep 5 && curl -s localhost:8080/healthdar tempo para um serviço subir
sleep 2msufixos funcionam no GNU e no macOS atual
Pipes, redirecionamento, globbing, variáveis, histórico e as teclas que mais economizam tempo. O macOS usa zsh por padrão: quase tudo isto funciona lá também, exceto shopt, help e recursos do bash 4 (o macOS traz o bash 3.2).
ps aux | grep nginxfiltrar uma listagem
history | grep 'docker run'encontrar um comando que você rodou antes
set -o pipefailem scripts: um pipeline falha se qualquer parte falhar, não só a última
ls -l > listing.txtsobrescrever (cria o arquivo)
echo 'done' >> progress.logacrescentar
set -o noclobberfazer o > se recusar a sobrescrever arquivos existentes (>| força)
O shell esvazia o arquivo antes de o comando rodar, então sort arquivo > arquivo deixa você com um arquivo vazio. Grave com outro nome e depois use mv.
find / -name x 2>/dev/nulldescartar as mensagens de erro
./build.sh > build.log 2>&1saída e erros em um arquivo (a ordem importa: primeiro >, depois 2>&1)
./build.sh &> build.logatalho do bash para o mesmo
mysql mydb < dump.sqlarquivo como entrada
cat > config.yml <<'EOF'
port: 8080
host: $HOST stays literal
EOFcolocar 'EOF' entre aspas impede a expansão das $variáveis
grep -c a <<< "banana"here-string
make && sudo make installinstalar só se o build deu certo
cd /srv/app || exit 1parar um script se o cd falhar
(cd frontend && npm run build)parênteses: um subshell, então o seu diretório não muda
echo "Today is $(date +%A)"substituição de comando
echo $(( 1024 * 4 ))aritmética com inteiros
diff <(ls dir1) <(ls dir2)substituição de processo: a saída como arquivo temporário
Crases `comando` são a forma antiga de $(comando); $( ) pode ser aninhado e é mais legível.
ls *.jpgtodos os JPGs desta pasta
rm photo-??.pngphoto-01.png … photo-99.png
cp config.{yml,yml.bak}expansão de chaves: cp config.yml config.yml.bak
shopt -s globstar; ls **/*.md** pega qualquer profundidade (bash 4+)
Os globs não pegam dotfiles por padrão (shopt -s dotglob muda isso). Se nada corresponder, o bash passa o padrão literalmente, a menos que shopt -s nullglob esteja ativo.
echo 'Cost: $5'aspas simples: nada é expandido
echo "Home is $HOME"aspas duplas: as variáveis são expandidas e os espaços mantidos
cp "$file" "$dest/"sempre coloque entre aspas variáveis que guardam caminhos: espaços quebram as que estão sem aspas
name="Ada"; echo "Hi $name"definir e usar
echo "${PORT:-8080}"valor padrão quando não definida ou vazia
file=report.tar.gz; echo "${file%%.*}" "${file##*/}"remover a extensão / remover o diretório
echo "${#name}"comprimento da string
export NODE_ENV=productionvisível para todo programa iniciado a partir deste shell
DEBUG=1 ./appsó para aquele comando
printenv | sortlistá-las
unset DEBUGremover
Somem quando o shell é fechado. Coloque os exports no ~/.bashrc (shells interativos) ou no ~/.profile (shells de login) para mantê-los.
echo "$PATH" | tr : '\n'uma entrada por linha
export PATH="$HOME/.local/bin:$PATH"colocar a sua pasta bin na frente (adicione ao ~/.bashrc)
hash -resquecer os locais de comandos em cache depois de mover binários
alias ll='ls -alF'adicione ao ~/.bashrc para manter
source ~/.bashrcaplicar as mudanças sem abrir um novo terminal (o mesmo que . ~/.bashrc)
\lsrodar o ls de verdade, ignorando um alias
grep -q root /etc/passwd; echo $?0 encontrado, 1 não encontrado, 2 erro
set -euo pipefailno topo de um script: parar em erros, variáveis não definidas e pipes que falham
sudo !!repetir o último comando com sudo
cd !$usar o último argumento do comando anterior
!42repetir a linha 42 do histórico
^foo^barrepetir o último comando trocando foo por bar
Com HISTCONTROL=ignorespace (padrão no Ubuntu, como parte de ignoreboth), um comando digitado com um espaço no início não é salvo: útil para comandos com segredos.
bind -P | lesslistar todos os atalhos de teclas
man rsyncmanual completo; / para pesquisar, q para sair
man 5 crontabseção 5: o formato do arquivo, não o comando
help cdos builtins do bash não têm man page própria
apropos partitionquais comandos mencionam uma palavra
#!/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"
doneargumentos, um teste, um loop
chmod +x script.sh && ./script.sh Adatornar executável e rodar
bash -x script.shrastrear cada linha durante a execução
$1 … $9 são os argumentos, "$@" são todos eles, $# é quantos são. [[ ]] é do bash; use [ ] em scripts POSIX sh.
Loops e condicionais do Bash ao lado do CMD e do PowerShell →
resetdepois que um cat em um arquivo binário deixou o terminal mostrando lixo
Encontrou um problema ou algo que poderia ser melhor? Lemos todas as mensagens e corrigimos rápido.
Este guia rápido de comandos Linux agrupa mais de 200 comandos pela tarefa que você quer fazer: navegar e gerenciar arquivos, permissões, processos, espaço em disco, rede, pacotes, usuários, arquivos compactados, buscas, processamento de texto, serviços e logs do systemd, cron e o básico do bash que amarra tudo isso. Cada entrada traz a sintaxe, as opções que você vai realmente usar com uma explicação de uma linha, exemplos para copiar e, quando importa, um alerta. Pesquise por tarefa (“espaço livre em disco”, “porta 8080”) ou pelo nome do comando, e crie um link direto para qualquer entrada.
As opções seguem os manuais do GNU coreutils, util-linux, procps-ng, iproute2, systemd e bash, que é o que Ubuntu, Debian, Fedora, RHEL, Arch e openSUSE trazem. Onde o macOS se comporta de outro jeito, uma nota azul explica como, porque sed -i, date -d, stat -c e xargs são os pontos clássicos em que um script escrito num sistema quebra no outro. É uma referência para os 90% comuns, não um substituto das man pages: para opções pouco usadas, man <comando> continua sendo a autoridade.
Comece pela navegação e pelos arquivos: pwd, ls, cd, mkdir, cp, mv, rm, cat e less. Depois man (ajuda), sudo, grep e find para buscas, chmod e chown para permissões, ps, top e kill para processos, df e du para espaço em disco, e ssh e scp para máquinas remotas. Aprenda pipes (|) e redirecionamento (> e >>) cedo, porque eles permitem combinar todo o resto.
Execute df -h para ver o espaço livre em todos os sistemas de arquivos montados, em unidades legíveis. Para descobrir o que está ocupando o espaço, execute du -h -d 1 | sort -h dentro de um diretório: ele lista as subpastas com as maiores por último. Se o df diz que o disco está cheio, mas o du não encontra nada, provavelmente um arquivo apagado ainda está aberto por algum processo; sudo lsof +L1 lista esses arquivos.
Execute sudo ss -tulpn para listar todas as portas TCP e UDP em escuta com o programa dono de cada uma, ou sudo lsof -i :8080 para uma porta específica. O sudo faz diferença: sem ele, você só vê os nomes dos seus próprios processos. O ss substituiu o netstat, que ainda funciona em sistemas com o pacote net-tools instalado.
kill PID envia SIGTERM, que pede ao processo que termine e deixa que ele faça a limpeza: gravar arquivos, liberar travas, fechar conexões. kill -9 PID envia SIGKILL, que o kernel aplica imediatamente e que o processo não pode capturar nem ignorar, então nenhuma limpeza acontece. Use o kill simples primeiro, espere alguns segundos e reserve o -9 para processos que o ignoram.
O macOS vem com o sed do BSD, em que o -i exige um argumento de extensão de backup. No macOS, escreva sed -i '' 's/old/new/g' file; no Linux, com o GNU sed, o mesmo comando falha porque ele lê '' como o script. A forma que funciona nos dois é sed -i.bak 's/old/new/g' file, que mantém uma cópia de backup que você pode apagar depois.
Quase todos: as ferramentas principais vêm dos mesmos projetos GNU e util-linux em todo lugar. O que muda é o gerenciador de pacotes (apt no Debian e no Ubuntu, dnf no Fedora e no RHEL, pacman no Arch, zypper no openSUSE, mostrados lado a lado na tabela de Pacotes), alguns caminhos de arquivos de log, o grupo de administradores (sudo ou wheel) e a interface do firewall (ufw ou firewalld). Sistemas Alpine e baseados em BusyBox usam versões menores das ferramentas, com menos opções.
Uma lista curta de comandos causa quase todo o estrago: rm -rf com um caminho errado ou vazio, dd ou mkfs apontados para o disco errado, chmod -R 777 ou chown -R num diretório do sistema, rsync --delete ou espelhamentos no estilo robocopy com origem e destino trocados, crontab -r em vez de crontab -e, usermod -G sem -a, e find com -delete na posição errada. Cada um está marcado como Perigoso no guia, com a forma específica como dá errado.
O hábito que evita a maior parte disso é executar primeiro a versão inofensiva. Antes de rm -rf, execute ls no mesmo caminho. Antes de find … -delete, execute o mesmo find com -print. Antes de rsync --delete, adicione -n para uma simulação. Antes de dd ou mkfs, execute lsblk e leia o nome do dispositivo duas vezes. Em scripts, escreva ${DIR:?} em vez de $DIR, para que uma variável vazia aborte o script em vez de transformar o caminho em /.
Duas configurações do shell também ajudam: set -euo pipefail no início dos scripts para na primeira falha em vez de continuar num estado ruim, e set -o noclobber faz o > se recusar a sobrescrever um arquivo existente.
O macOS é Unix, mas as ferramentas de linha de comando dele vêm do FreeBSD, e não do GNU, e as diferenças aparecem justamente quando você copia um comando de um tutorial de Linux:
• sed -i precisa de um argumento no macOS (sed -i '' …); -i.bak funciona nos dois.
• date não tem -d no macOS; use date -r <epoch> para converter um timestamp e date -v-2d para datas relativas.
• stat usa -f com outras letras de formato, em vez do -c do GNU.
• xargs no macOS ignora entrada vazia por padrão, enquanto o GNU xargs executa o comando uma vez, a menos que receba -r.
• du aceita -d 1 nos dois, mas só o GNU aceita --max-depth; ps não tem --sort no macOS (use ps aux -m ou -r).
• head -n -5, tac, free, ip, ss, timeout e watch não existem no macOS padrão.
Se você precisa do comportamento GNU num Mac, os pacotes coreutils, gnu-sed e findutils do Homebrew instalam as versões GNU com o prefixo g (gsed, gdate, gstat, gxargs).
O ls -l mostra as permissões como dez caracteres, por exemplo -rwxr-x---. O primeiro é o tipo (- arquivo, d diretório, l link); os nove seguintes são três grupos de leitura, escrita e execução para o dono, o grupo e todos os demais. Em números, r vale 4, w vale 2 e x vale 1, somados por grupo, então rwxr-x--- é 750.
Modos típicos: 644 para arquivos comuns, 755 para diretórios e scripts, 600 para chaves privadas e arquivos com segredos, 700 para um diretório privado como ~/.ssh. Num diretório, x significa “pode entrar”, e é por isso que diretórios precisam dele e arquivos comuns não. A calculadora de chmod converte entre as formas simbólica e octal, se você quiser conferir um modo antes de aplicá-lo.