Comando find: procurar ficheiros e detetar riscos no Linux

Terminal Linux a executar o comando find sobre uma árvore de diretórios, com resultados destacados

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 1 o find nem 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 -delete implica.
  • -P, -L e -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á ainda s, p, b e c para sockets, fifos e dispositivos).
  • -size +10M / -size -10k — maior ou menor do que o valor indicado. Atenção: o find arredonda para cima na unidade escolhida, pelo que -size -10k significa «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; -mmin aplica a mesma lógica em minutos.
  • -newer ficheiro — mais recente do que um ficheiro de referência; a variante -newermt aceita 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; -print0 separa por byte nulo, o par natural do xargs -0 quando 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: %p caminho, %s tamanho, %m permissões, %u dono.
  • -exec comando {} \; — executa o comando uma vez por resultado; com {} + o find agrupa os resultados e executa o menor número de vezes possível, muito mais depressa. O -ok faz o mesmo, mas pede confirmação.
  • -delete — apaga o que corresponder e implica -depth; teste sempre a mesma expressão com -print antes 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 *.log no diretório atual, a shell expande o glob antes do find o 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 -print ao lado direito do -o.
  • Confundir as formas do -perm777, -MODO e /MODO respondem 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 -print0 com xargs -0, ou -exec ... {} +, em vez de passar a saída em texto simples.
  • Testar destrutivos a seco — antes de qualquer -delete ou -exec rm, corra a mesma expressão com -print e 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.