>_ josetilabs.com
← blog

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

bash
#!/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.

Terminal mostrando du -h por diretório e find por arquivos acima de 10 MB, com dump.sql de 120 MB e log-app.log de 50 MB no topo
As duas primeiras seções do script rodando num diretório de teste. O degrau maior é o dump.sql.

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.

Leia também

// Por e-mail

Os textos publicados aqui também vão por e-mail. O envio ainda não começou: quem deixar o endereço agora entra na primeira lista.

Guardo só o seu e-mail, a data e o registro desta autorização. Sem cookies, sem rastreador e nada compartilhado com terceiros. Detalhes na política de privacidade.