22 out 2026 · linux, disco, diagnostico · 4 min
Disco cheio: como achar o que está ocupando
O disco encheu e o df diz 100%. O que importa não é o total, é quem está ocupando. Três comandos em sequência resolvem na maioria dos casos: du para achar o diretório, find para achar o arquivo, e a leitura de /proc para o caso em que o arquivo já foi apagado mas ainda ocupa espaço porque um processo o mantém aberto.
O parágrafo-resposta
Rode du -h --max-depth=1 | sort -hr para ver qual diretório pesa mais. Depois find . -type f -size +50M para listar arquivos grandes. Se o espaço não voltou depois de apagar, procure em /proc/*/fd por entradas marcadas como (deleted): o arquivo sumiu do ls, mas o inode continua vivo.
O artefato: três passos num script
#!/usr/bin/env bash
# achar-o-que-ocupa.sh
# Uso: ./achar-o-que-ocupa.sh [diretorio] [tamanho_minimo_em_MB]
set -euo pipefail
DIR="${1:-.}"
MIN="${2:-50}"
# 1. tamanho por diretorio, um nivel, do maior para o menor
echo '=== 1. tamanho por diretorio (um nivel) ==='
du -h --max-depth=1 "$DIR" 2>/dev/null | sort -hr
# 2. arquivos maiores que MIN MB, em bytes, do maior para o menor
echo
echo "=== 2. arquivos maiores que ${MIN}MB ==="
find "$DIR" -type f -size +"${MIN}M" -printf '%s %p\n' 2>/dev/null | sort -nr |
while read -r tam caminho; do
mb=$(awk -v b="$tam" 'BEGIN { printf "%.1f", b/1024/1024 }')
printf '%10s MB %s\n' "$mb" "$caminho"
done
# 3. arquivos apagados que ainda ocupam espaco, via /proc (sem lsof)
echo
echo '=== 3. arquivos apagados que ainda ocupam espaco (fd aberto) ==='
achou=0
for fd in /proc/[0-9]*/fd/*; do
[ -L "$fd" ] || continue
alvo=$(readlink "$fd" 2>/dev/null || true)
case "$alvo" in
*'(deleted)'*)
pid=$(echo "$fd" | sed -E 's#/proc/([0-9]+)/fd/.*#\1#')
tam=$(stat -L -c %s "$fd" 2>/dev/null || echo 0)
mb=$(awk -v b="$tam" 'BEGIN { printf "%.1f", b/1024/1024 }')
if awk -v m="$mb" 'BEGIN { exit (m+0 > 0) ? 0 : 1 }'; then
printf '%10s MB pid=%s %s\n' "$mb" "$pid" "$alvo"
achou=1
fi
;;
esac
done
[ "$achou" -eq 0 ] && echo '(nenhum arquivo apagado aberto encontrado)'
O script não instala nada, não escreve arquivo e roda com as ferramentas que já existem numa instalação mínima de Linux.
Como verificar
Rode o script num diretório de teste e confira as três seções. Saída esperada, copiada de uma execução real (diretório com 181 MB no total):
=== 1. tamanho por diretorio (um nivel) ===
181M .
171M ./sub-a
11M ./sub-b
=== 2. arquivos maiores que 50MB ===
120.0 MB ./sub-a/dump.sql
50.0 MB ./sub-a/log-app.log
=== 3. arquivos apagados que ainda ocupam espaco (fd aberto) ===
30.0 MB pid=2001844 .../segredo.log (deleted)
Se a seção 3 mostrar uma entrada, o arquivo já foi removido do diretório mas o processo ainda o mantém aberto. A correção é reiniciar o processo (ou fechar o descritor), não apagar de novo.
Se der errado
du mostra 181 MB mas o df diz 10 GB usados. O du não conta espaço reservado para o usuário root (tipicamente 5% em ext4) nem arquivos apagados abertos. Rode a seção 3 do script. Se ela estiver vazia, confira df -i: podem ser inodes, não bytes.
find não encontra o arquivo grande. O find parte do diretório atual por padrão. Passe o caminho absoluto, por exemplo ./achar-o-que-ocupa.sh /var/log 10. Arquivos em pontos de montagem diferentes não aparecem; use df para ver os montagens antes.
a seção 3 não lista nada mas o espaço não voltou. O arquivo pode ter sido apagado por outro usuário ou o processo pode ter fechado o descritor entre a remoção e a leitura. Rode lsof +L1 se tiver lsof instalado; ele mostra o mesmo dado com mais detalhe.
Alternativas
| Ferramenta | O que faz de diferente | Quando usar |
|---|---|---|
| ncdu | interface interativa, navega por diretório | quando você quer explorar, não apenas o topo |
| dust | barras visuais, mais rápido que du | quando o diretório tem milhares de arquivos |
| lsof +L1 | lista apenas arquivos apagados abertos | quando o du e o df não batem |
| du -sh * | total por entrada, sem recursão | para uma olhada rápida no diretório atual |
O script acima cobre o caso mais comum sem instalar nada. ncdu e dust são convenientes, mas exigem instalação, o que nem sempre é possível num servidor de produção.
FAQ
Por que o du e o df não batem? O du soma o tamanho dos arquivos que existem no diretório. O df conta blocos alocados no sistema de arquivos, incluindo espaço reservado, metadados e arquivos apagados mas ainda abertos. A diferença é normal; o que importa é a tendência.
Como achar o que ocupa num contêiner Docker?
Entre no contêiner com docker exec -it nome bash e rode o script lá. O sistema de arquivos do contêiner é separado do host, então rodar no host não encontra os arquivos do contêiner.
O arquivo grande é um log. Apago ou rotaciono?
Rotacione. Apagar um log aberto por um serviço não libera espaço até o serviço reiniciar. Use logrotate ou trunque com : > arquivo se souber que o serviço reabre o descritor. Veja também o post cron do jeito certo para agendar a rotação.
E se for o journal do systemd?
Limite com journalctl --vacuum-size=100M ou --vacuum-time=7d. Isso é seguro e imediato.
Posso rodar o find no sistema inteiro?
Sim, mas com cuidado: find / -type f -size +100M percorre tudo, incluindo montagens de rede. Adicione -xdev para não cruzar sistemas de arquivos.
Fontes: du(1), find(1), lsof(8). Veja também o que come a RAM e backup com rsync que dá para restaurar.