Qualquer administrador de sistemas ou analista de segurança faz esta pergunta várias vezes por dia: «onde está o ficheiro que cumpre estas condições?» Pode ser o registo alterado nas últimas horas, o binário com permissões suspeitas ou a cópia de segurança que está a encher o disco. O find é a resposta do Linux — provavelmente o comando mais poderoso e mais mal compreendido da caixa de ferramentas.
Ao contrário do que parece à primeira vista, o find não filtra uma lista já feita: percorre a árvore de diretórios em profundidade e avalia uma expressão em cada ficheiro que visita. Perceber esse modelo de execução é o que separa quem decora receitas de quem constrói pesquisas à medida com confiança.
O que faz o find
O find recebe um ou mais pontos de partida e uma expressão composta por opções, testes e ações. Para cada entrada da árvore, avalia a expressão da esquerda para a direita; quando dois testes aparecem lado a lado, existe um E implícito entre eles, e se nenhuma ação for indicada o find acrescenta um -print à expressão inteira. A sintaxe geral é esta:
find [opções] [pontos-de-partida] [expressão]
# exemplo típico: ficheiros .log modificados na última semana
find /var/log -type f -name '*.log' -mtime -7
Como o percurso é feito ficheiro a ficheiro, o custo depende do tamanho da árvore, não do número de resultados — daí a importância das opções que podam o percurso cedo.
As opções que interessam
Onde e até onde procurar
-maxdepth N— não desce mais do que N níveis; com-maxdepth 1ofindnem entra nas subpastas.-mindepth N— ignora tudo acima do nível N, incluindo o próprio ponto de partida.-depth— percorre em pós-ordem: primeiro o conteúdo, depois o diretório que o contém. É o modo que o-deleteimplica.-P,-Le-H— controlam o tratamento das ligações simbólicas: nunca seguir (predefinição), seguir sempre, ou seguir apenas as indicadas na linha de comandos.-xdev— não atravessa para outro sistema de ficheiros; essencial quando se pesquisa a partir de/.
Testes de nome e caminho
O -name compara apenas o nome do ficheiro com um glob da shell; o -iname faz o mesmo sem distinguir maiúsculas de minúsculas. O padrão deve ir sempre entre plicas, para a shell não o expandir antes de o find o receber. Já o -path compara o caminho completo — e aí o * atravessa barras. Para padrões mais exigentes existe o -regex, que aplica uma expressão regular ao caminho inteiro, do princípio ao fim.
find . -name '*.pcap' # só o nome; nao apanha sessao.pcapng
find . -iname '*.PCAP' # ignora maiusculas
find . -path '*/uploads/*' # caminho completo
find . -regex '.*\.\(sh\|py\)' # regex sobre o caminho inteiro
Tipo, tamanho e tempo
-type f,-type d,-type l— ficheiros normais, diretórios e ligações simbólicas (há aindas,p,becpara sockets, fifos e dispositivos).-size +10M/-size -10k— maior ou menor do que o valor indicado. Atenção: ofindarredonda para cima na unidade escolhida, pelo que-size -10ksignifica «até cerca de 9 KiB».-empty— ficheiros com zero bytes e diretórios sem conteúdo.-mtime -7/-mtime +180— modificado há menos de 7 dias ou há mais de 180;-mminaplica a mesma lógica em minutos.-newer ficheiro— mais recente do que um ficheiro de referência; a variante-newermtaceita uma data escrita, ideal para delimitar janelas temporais.
Dono e permissões
Com -user e -group filtra-se por proprietário; -nouser e -nogroup apanham ficheiros órfãos, sem correspondência na base de contas do sistema. O -perm tem três formas com significados muito diferentes: -perm 777 exige permissões exatamente iguais, -perm -MODO exige todos os bits indicados e -perm /MODO basta-se com um deles. Por fim, -readable, -writable e -executable testam com os privilégios reais de quem executa o comando.
Operadores
Entre testes vizinhos há um E implícito (-a); o -o introduz o OU, com menor precedência do que o E, e o ! (ou -not) nega o teste seguinte. Os parênteses agrupam, mas têm de ser escapados para a shell não os interpretar. O idioma da poda merece atenção especial:
find . \( -name '*.log' -o -name '*.gz' \) -type f
find . -name .git -prune -o -type f -print
No segundo exemplo, o -prune impede a descida para dentro de .git. O -print explícito no lado direito do -o é obrigatório: sem ele, o -print implícito aplica-se à expressão inteira e o próprio .git ainda aparece no resultado.
Ações
-print— a ação implícita;-print0separa por byte nulo, o par natural doxargs -0quando há espaços nos nomes.-ls— listagem detalhada de cada resultado, sem precisar de comandos externos.-printf '%p %s\n'— saída com formato à medida:%pcaminho,%stamanho,%mpermissões,%udono.-exec comando {} \;— executa o comando uma vez por resultado; com{} +ofindagrupa os resultados e executa o menor número de vezes possível, muito mais depressa. O-okfaz o mesmo, mas pede confirmação.-delete— apaga o que corresponder e implica-depth; teste sempre a mesma expressão com-printantes de a usar.-quit— termina no primeiro resultado;-print -quité a forma mais eficiente de verificar se algo existe.
find em cibersegurança
Em resposta a incidentes, o find é frequentemente a primeira ferramenta a tocar no disco. Alguns padrões que qualquer analista deve ter na ponta dos dedos:
# caça a webshells: PHP recente em pastas de uploads
find /var/www -path '*/uploads/*' -name '*.php' -mtime -7
# escalada de privilégios: binarios SUID fora do lugar
find / -xdev -perm -4000 -type f -ls
# hardening: ficheiros com escrita para toda a gente
find /var/www -type f -perm -o+w
# forense: tudo o que mudou numa janela temporal
find / -xdev -newermt '2026-07-24 00:00' ! -newermt '2026-07-25 00:00' -type f
No primeiro caso, caminho, extensão e data reduzem milhares de ficheiros a meia dúzia de suspeitos. No segundo, a pesquisa de binários SUID é uma etapa clássica de auditorias e testes de intrusão: um executável com o bit 4000 corre com os privilégios do dono. O terceiro apanha permissões perigosas em ficheiros de configuração, e o quarto reconstrói a linha temporal de uma intrusão sem depender de registos que o atacante possa ter limpado.
Experimente no simulador interativo
A simulação abaixo mostra o que os manuais não conseguem: a árvore a ser percorrida ao lado do resultado. À esquerda vê os ficheiros a mudar de estado — não visitado, visitado, correspondente, podado — enquanto o terminal à direita imprime a saída. Clique nos botões de opções para compor a sua própria expressão (os grupos incompatíveis desativam-se uns aos outros), use Demonstrar tudo para ver as trinta e cinco combinações comentadas, ou avance passo a passo com Anterior e Seguinte. O -delete é apenas simulado — nada é apagado.
Erros comuns e boas práticas
- Padrões sem plicas — se existir um
*.logno diretório atual, a shell expande o glob antes dofindo ver e a pesquisa devolve resultados errados. - Ordem dos argumentos com -delete — a expressão avalia-se da esquerda para a direita:
find . -delete -name '*.tmp'apaga tudo antes de testar o nome. A ação vem sempre no fim. - -prune sem -print explícito — o diretório podado não é percorrido, mas ainda aparece no resultado; acrescente
-printao lado direito do-o. - Confundir as formas do -perm —
777,-MODOe/MODOrespondem a perguntas diferentes; numa auditoria, a escolha errada esconde exatamente o que procura. - Esquecer o arredondamento do -size — os tamanhos são arredondados para cima na unidade indicada; para intervalos exatos use a unidade
c(bytes). - Nomes com espaços em pipelines — use sempre
-print0comxargs -0, ou-exec ... {} +, em vez de passar a saída em texto simples. - Testar destrutivos a seco — antes de qualquer
-deleteou-exec rm, corra a mesma expressão com-printe confirme a lista.
Conclusão
O find é uma linguagem de pesquisa completa disfarçada de comando: pontos de partida, testes, operadores e ações combinam-se para responder a praticamente qualquer pergunta sobre um sistema de ficheiros. Quem domina o modelo de percurso — e as suas armadilhas — ganha uma ferramenta de administração, auditoria e resposta a incidentes que nenhuma interface gráfica substitui.
Se quer levar estas competências mais longe, com formação prática em Linux e cibersegurança ou apoio especializado à sua organização, conheça o catálogo de serviços de formação e consultoria da HJFR. E se está a construir as bases da administração de sistemas, veja também o nosso artigo sobre o useradd.
Este artigo faz parte da série «Comandos Linux, um a um» do blog HJFR — fique atento aos próximos comandos.
