Tutorial

Comando find no Linux: busca de arquivos por nome, tamanho e data, com exemplos

Atualizado: · Skillaria.Top

O comando find percorre a árvore de diretórios e seleciona arquivos por condições: find /caminho -name '*.log' busca pelo nome, -type f apenas arquivos, -size +100M maiores que 100 MB e -mtime -7 alterados na última semana. As condições se combinam, e sobre o resultado é possível executar uma ação com -exec, -delete ou passar a lista para o xargs.

O comando find percorre a árvore de diretórios e encontra arquivos pelas condições de nome, tipo, tamanho, data de modificação, dono e permissões. O formato geral é find [onde buscar] [condições] [ação]. A seguir reunimos exemplos de find no Linux para tarefas típicas: localizar um arquivo de configuração, apagar logs antigos e descobrir o que está ocupando o disco.

Sintaxe do comando find

find /var/log -type f -name '*.log' -mtime +30 -print

Vamos separar por partes:

  • /var/log — ponto de partida. Você pode informar vários diretórios em sequência ou . (o atual). Sem caminho, o GNU find busca no diretório atual.
  • -type f -name '*.log' -mtime +30 — condições (na documentação, são chamadas de testes). Por padrão, elas são unidas por um "E" lógico.
  • -print — ação: exibir o caminho. Ela é aplicada automaticamente se nenhuma outra ação for informada.

O find percorre tudo recursivamente, em todos os subdiretórios. Se você o executa com um usuário comum em caminhos do sistema, a saída fica cheia de linhas Permission denied. Elimine-as redirecionando o fluxo de erros:

find / -name 'nginx.conf' 2>/dev/null

Busca por nome: -name e -iname

A condição -name compara somente o nome do arquivo (sem o caminho) com o padrão. O padrão aceita * (qualquer sequência de caracteres), ? (um caractere) e [abc] (um dos caracteres listados).

# nome exato
find /etc -name 'hosts'

# todos os arquivos .conf
find /etc -name '*.conf'

# sem diferenciar maiúsculas e minúsculas: README.md, readme.MD, Readme.md
find ~/projects -iname 'readme.md'

# report_1.csv ... report_9.csv
find . -name 'report_?.csv'

Sempre coloque o padrão entre aspas. Sem elas, o shell expande *.conf com os arquivos do diretório atual, e o find recebe uma lista de nomes em vez de um padrão. O resultado fica inesperado, ou o comando falha com o erro paths must precede expression.

Busca por caminho: -path e -regex

Se o diretório importa, e não apenas o nome, use -path, que compara o padrão com o caminho inteiro:

# arquivos .js apenas dentro de diretórios src
find . -path '*/src/*' -name '*.js'

Para padrões complexos existe o -regex (uma expressão regular também aplicada ao caminho completo) e o -iregex, sem diferenciar maiúsculas de minúsculas:

find . -regextype posix-extended -regex '.*\.(jpg|jpeg|png)$'

Como excluir um diretório

Para que o find não entre, por exemplo, em node_modules ou .git, use -prune:

find . -path ./node_modules -prune -o -name '*.js' -print

Leia assim: "se o caminho for ./node_modules, não desça nele; senão (-o), mostre os arquivos *.js". O -print explícito no fim é obrigatório, senão o próprio diretório excluído aparece na saída. Uma alternativa mais simples, porém mais lenta, é -not -path '*/node_modules/*': o find percorre o diretório mesmo assim e apenas filtra o resultado.

Busca por tipo: -type

ValorO que busca
-type farquivos comuns
-type ddiretórios
-type llinks simbólicos
-type ssockets
-type ppipes nomeados (FIFO)
# apenas diretórios chamados logs
find / -type d -name 'logs' 2>/dev/null

# arquivos e diretórios vazios
find . -type f -empty
find . -type d -empty

# links simbólicos quebrados
find . -xtype l

Busca por tamanho: -size

A condição -size aceita um número com sufixo: c — bytes, k — kilobytes, M — megabytes, G — gigabytes. O sinal + significa "maior que", - significa "menor que", e sem sinal, "exatamente".

# arquivos maiores que 100 MB em todo o sistema
find / -type f -size +100M 2>/dev/null

# entre 10 e 50 MB
find . -type f -size +10M -size -50M

# menores que 1 KB
find . -type f -size -1k

Há uma pegadinha: o tamanho é arredondado para cima na unidade escolhida. Por isso, -size -1M encontra apenas arquivos vazios, já que qualquer arquivo não vazio ocupa "pelo menos 1 megabyte" após o arredondamento. Para limites exatos, use unidades menores: -size -1024k.

O que ocupa espaço no disco

A combinação do find com ls e sort mostra os maiores arquivos:

find /var -type f -size +50M -exec ls -lh {} + 2>/dev/null | sort -k5 -rh | head
-rw-r----- 1 syslog adm  1.2G Oct 14 09:12 /var/log/syslog.1
-rw-r--r-- 1 root   root 412M Oct 10 03:00 /var/backups/db.sql.gz
-rw-r----- 1 root   adm   96M Oct 14 09:15 /var/log/nginx/access.log

Para estimar diretórios inteiros, du -sh é mais prático; o find brilha quando um único arquivo enorme, em algum ponto profundo da árvore, consome o espaço.

Busca por data: -mtime, -mmin, -newer

Cada arquivo tem três marcas de tempo, e o find filtra por qualquer uma delas:

CondiçãoMarcaUnidade
-mtime / -mminalteração do conteúdodias / minutos
-atime / -aminúltima leituradias / minutos
-ctime / -cminalteração de metadados (permissões, dono, nome)dias / minutos

Os sinais funcionam como no tamanho: -mtime -7 — alterado há menos de 7 dias, -mtime +30 — há mais de 30 dias.

# alterados na última semana
find ~/projects -type f -mtime -7

# logs com mais de 30 dias
find /var/log -type f -name '*.log' -mtime +30

# alterados nos últimos 15 minutos
find /etc -type f -mmin -15

Os dias são contados em períodos inteiros de 24 horas, e a parte fracionária é descartada. Por isso, -mtime +1 encontra arquivos com mais de 48 horas, e não de 24 — é uma armadilha comum. Se precisar de precisão, use minutos: -mmin +1440.

Arquivos mais novos que outro arquivo ou que uma data

# alterados depois da última modificação de deploy.lock
find . -type f -newer deploy.lock

# alterados depois de uma data específica (GNU find)
find . -type f -newermt '2026-10-01'

# dentro de um intervalo de datas
find . -type f -newermt '2026-10-01' ! -newermt '2026-10-08'

Busca por dono e permissões

# arquivos do usuário alice
find /home -user alice

# arquivos sem dono válido (após remover um usuário)
find / -nouser 2>/dev/null

# arquivos com permissões exatamente 777
find /var/www -type f -perm 777

# arquivos com escrita liberada para todos
find /var/www -perm -o=w

# arquivos com o bit SUID — útil em auditorias de segurança
find / -perm -4000 -type f 2>/dev/null

O -perm tem três formas: sem sinal, as permissões coincidem exatamente; com -, pelo menos todos os bits informados estão ativos; com /, pelo menos um dos bits informados está ativo.

Lógica das condições: E, OU, NÃO

As condições são unidas por "E" por padrão. Para "OU", use -o; para negar, use ! ou -not. O agrupamento é feito com parênteses, que precisam ser escapados para o shell:

# imagens jpg ou png
find . -type f \( -name '*.jpg' -o -name '*.png' \)

# tudo, exceto arquivos .tmp
find . -type f ! -name '*.tmp'

Sem os parênteses, o -type f se aplicaria apenas à primeira condição do par "OU", e diretórios chamados *.png entrariam no resultado. Os espaços ao redor de \( e \) são obrigatórios.

Profundidade da busca: -maxdepth e -mindepth

# apenas no diretório atual, sem subdiretórios
find . -maxdepth 1 -type f -name '*.sh'

# a partir do segundo nível de profundidade
find . -mindepth 2 -name '*.md'

# não atravessar para outros sistemas de arquivos
find / -xdev -type f -size +1G

Coloque -maxdepth logo depois do caminho, antes das demais condições; caso contrário, o GNU find mostra um aviso. A opção -xdev é útil ao buscar em /: o find não entra em /proc, em discos de rede nem em discos montados.

Ações sobre o resultado: -exec, -delete, xargs

-exec: executar um comando para cada arquivo

No lugar de {}, o find insere o caminho do arquivo. O comando termina com \; ou +:

# uma execução por arquivo
find . -name '*.sh' -exec chmod +x {} \;

# todos os arquivos em uma única lista — mais rápido
find . -name '*.log' -exec gzip {} +

# com confirmação para cada arquivo
find . -name '*.bak' -ok rm {} \;

A variante com + agrupa os caminhos em lotes e executa o comando muito menos vezes, por isso é várias vezes mais rápida com milhares de arquivos. A variante com \; é necessária quando o comando aceita apenas um arquivo ou quando o {} não fica no fim.

-delete: apagar o que foi encontrado

# primeiro veja o que seria apagado
find /tmp/build -type f -name '*.o' -mtime +7

# depois apague
find /tmp/build -type f -name '*.o' -mtime +7 -delete

Execute sempre primeiro sem -delete e confira a lista. E coloque o -delete por último: o find avalia a expressão da esquerda para a direita, então find . -delete -name '*.o' apagaria tudo no diretório antes de verificar o nome.

find e xargs

A combinação clássica é passar a lista de arquivos para outro programa com xargs. Para não quebrar com nomes que têm espaços, use o byte nulo como separador:

find . -type f -name '*.txt' -print0 | xargs -0 wc -l

A opção -P do xargs executa o processamento em paralelo:

find ./images -name '*.png' -print0 | xargs -0 -P 4 -n 10 optipng

find e grep: buscar texto dentro dos arquivos

O find procura arquivos, não o conteúdo deles. Para encontrar uma string dentro dos arquivos selecionados, entregue-os ao grep:

# onde aparece listen 8080 nos arquivos de configuração
find /etc/nginx -type f -name '*.conf' -exec grep -Hn 'listen 8080' {} +
/etc/nginx/sites-enabled/app.conf:4:    listen 8080;

A opção -H mostra o nome do arquivo, -n o número da linha, e grep -l exibe apenas os nomes dos arquivos com correspondência. Se o filtro é só pela extensão, o próprio grep basta: grep -rn --include='*.conf' 'listen 8080' /etc/nginx.

Formato de saída próprio: -printf

O GNU find também pode imprimir mais do que o caminho. Por exemplo, o tamanho, a data e o nome:

find . -maxdepth 1 -type f -printf '%s\t%TY-%Tm-%Td\t%p\n' | sort -n

Aqui, %s é o tamanho em bytes, %T... é a data de modificação em partes, e %p é o caminho. Isso é útil em scripts, pois você não precisa interpretar a saída do ls.

Cola rápida: exemplos de find linux para o dia a dia

TarefaComando
Encontrar um arquivo pelo nomefind / -name 'arquivo.txt' 2>/dev/null
Sem diferenciar maiúsculasfind . -iname '*.jpg'
Apenas diretóriosfind . -type d -name 'cache'
Arquivos maiores que 1 GBfind / -xdev -type f -size +1G
Alterados no último diafind . -type f -mtime -1
Alterados na última horafind . -type f -mmin -60
Apagar logs com mais de 30 diasfind /var/log/app -name '*.log' -mtime +30 -delete
Diretórios vaziosfind . -type d -empty
Alterar permissões de todos os diretóriosfind . -type d -exec chmod 755 {} +
Texto dentro dos arquivosfind . -name '*.py' -exec grep -l 'TODO' {} +
Contar arquivosfind . -type f | wc -l

Erros comuns

  • Padrão sem aspas. find . -name *.log quebra se houver qualquer arquivo .log no diretório atual. Escreva '*.log'.
  • Avalanche de Permission denied. Acrescente 2>/dev/null ou execute com sudo, se realmente precisar do disco inteiro.
  • -delete fora do lugar. Ele deve ser sempre o último, e antes dele deve haver uma execução de teste sem apagar nada.
  • Nomes com espaços no pipeline. find ... | xargs rm separa "Meu Arquivo.txt" em dois argumentos. Use -print0 com xargs -0 ou -exec.
  • Esperar dias exatos com -mtime. Para intervalos exatos, use -mmin ou -newermt.

Resumo

O find é uma ferramenta universal de busca no sistema de arquivos: caminho, condições de nome, tipo, tamanho, data e permissões, e depois a ação. Domine cinco pilares — -name, -type, -size, -mtime e -exec ... + — e a maioria das tarefas se resolve em uma linha. Vale repetir estes exemplos de find linux no seu terminal, e a combinação do find com grep, sed e awk é praticada na aula do curso de Linux sobre processamento de texto no terminal.

Perguntas frequentes

Qual é a diferença entre find e locate?

O locate busca em uma base de nomes criada antecipadamente, por isso responde na hora, mas não enxerga arquivos criados após a última atualização da base pelo comando updatedb. O find percorre o disco em tempo real e filtra por tamanho, data e permissões.

Como encontrar um arquivo pelo conteúdo, e não pelo nome?

O próprio find não lê o conteúdo. Use grep -rn 'texto' /caminho ou a combinação find . -name '*.conf' -exec grep -l 'texto' {} +.

Por que o find é lento quando executado na raiz do disco?

Ele percorre todos os diretórios, incluindo /proc, /sys e discos montados. Limite a busca a um diretório específico, use -xdev e -maxdepth, ou exclua o que não interessa com -prune.

É possível ordenar o resultado do find por data?

Sim: find . -type f -printf '%T@ %p\n' | sort -n lista os arquivos do mais antigo para o mais recente, onde %T@ é a data de modificação em segundos desde a época Unix.

Como encontrar e remover diretórios vazios?

O comando find . -type d -empty -delete remove todos os diretórios vazios, inclusive os que ficaram vazios após a remoção de seus subdiretórios. Execute primeiro sem -delete e confira a lista.

Aprenda este tema em vídeo

Este tema é abordado em profundidade, com prática, no curso “Linux: с нуля до уверенного администрирования”.

Ir para o curso