Comando find no Linux: busca de arquivos por nome, tamanho e data, com exemplos
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
| Valor | O que busca |
|---|---|
-type f | arquivos comuns |
-type d | diretórios |
-type l | links simbólicos |
-type s | sockets |
-type p | pipes 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ção | Marca | Unidade |
|---|---|---|
-mtime / -mmin | alteração do conteúdo | dias / minutos |
-atime / -amin | última leitura | dias / minutos |
-ctime / -cmin | alteraçã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
| Tarefa | Comando |
|---|---|
| Encontrar um arquivo pelo nome | find / -name 'arquivo.txt' 2>/dev/null |
| Sem diferenciar maiúsculas | find . -iname '*.jpg' |
| Apenas diretórios | find . -type d -name 'cache' |
| Arquivos maiores que 1 GB | find / -xdev -type f -size +1G |
| Alterados no último dia | find . -type f -mtime -1 |
| Alterados na última hora | find . -type f -mmin -60 |
| Apagar logs com mais de 30 dias | find /var/log/app -name '*.log' -mtime +30 -delete |
| Diretórios vazios | find . -type d -empty |
| Alterar permissões de todos os diretórios | find . -type d -exec chmod 755 {} + |
| Texto dentro dos arquivos | find . -name '*.py' -exec grep -l 'TODO' {} + |
| Contar arquivos | find . -type f | wc -l |
Erros comuns
- Padrão sem aspas.
find . -name *.logquebra se houver qualquer arquivo.logno diretório atual. Escreva'*.log'. - Avalanche de Permission denied. Acrescente
2>/dev/nullou execute comsudo, se realmente precisar do disco inteiro. -deletefora 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 rmsepara "Meu Arquivo.txt" em dois argumentos. Use-print0comxargs -0ou-exec. - Esperar dias exatos com
-mtime. Para intervalos exatos, use-mminou-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.
Este tema é abordado em profundidade, com prática, no curso “Linux: с нуля до уверенного администрирования”.
Ir para o curso