O comando find é uma ferramenta poderosa para localizar arquivos e diretórios no sistema de arquivos Linux. Ele permite buscas baseadas em diversos critérios, como nome, tipo, tamanho, data de modificação, permissões, entre outros. Além de localizar, o find pode executar ações sobre os resultados, como deletar, copiar ou executar um comando. Nesta aula, você aprenderá a usar o find de forma eficiente, combinando critérios e otimizando a performance.

O find percorre recursivamente diretórios a partir de um ponto de partida, aplicando expressões de teste a cada arquivo. A sintaxe básica é: find [caminho...] [expressão]. A expressão pode conter opções, testes e ações. Vamos explorar os principais usos.

Por nome, tipo, tamanho

O critério mais comum é buscar por nome usando a opção -name (case-sensitive) ou -iname (case-insensitive). Você pode usar curingas como * e ?. Por exemplo, find /home -name "*.txt" encontra todos os arquivos .txt no diretório /home.

Para buscar por tipo, use -type seguido de letras: f para arquivo regular, d para diretório, l para link simbólico, etc. Exemplo: find /var -type d lista todos os diretórios em /var.

Para tamanho, use -size com sufixos como c (bytes), k (kilobytes), M (megabytes), G (gigabytes). Prefixos + e - indicam maior ou menor que. Exemplo: find / -size +100M encontra arquivos maiores que 100 MB.

# Encontrar todos os arquivos .conf em /etc
find /etc -type f -name "*.conf"

# Encontrar diretórios vazios
find /home -type d -empty

# Encontrar arquivos entre 1k e 10k
find / -size +1k -size -10k

-exec

A ação -exec permite executar um comando para cada arquivo encontrado. A sintaxe é -exec comando {} \;, onde {} é substituído pelo nome do arquivo. O ponto e vírgula deve ser escapado (\;) ou citado. Uma alternativa mais eficiente é usar + no final para passar múltiplos arquivos de uma vez.

Exemplo: find /tmp -type f -name "*.log" -exec rm {} \; deleta todos os arquivos .log em /tmp. Para copiar: find . -name "*.jpg" -exec cp {} /backup/ \;.

# Encontrar e deletar arquivos temporários
find /tmp -type f -name "*.tmp" -exec rm {} \;

# Usar + para eficiência (passa vários arquivos por comando)
find /var/log -type f -name "*.log" -exec gzip {} +

# Executar com interação (pedir confirmação)
find . -name "*.txt" -ok rm {} \;

Combinando critérios

É possível combinar múltiplos testes usando operadores lógicos: -a (AND, padrão), -o (OR), ! (NOT). Use parênteses para agrupar (escapando-os). Exemplo: find / \( -name "*.txt" -o -name "*.md" \) -type f encontra arquivos .txt ou .md.

Outros testes úteis: -mtime (modificação), -atime (acesso), -perm (permissões), -user (proprietário). Exemplo: find /home -user joao -mtime -7 encontra arquivos do usuário joao modificados nos últimos 7 dias.

# Arquivos .txt ou .pdf maiores que 1MB
find /home \( -name "*.txt" -o -name "*.pdf" \) -size +1M

# Arquivos que NÃO são do usuário root
find / -type f ! -user root

# Diretórios com permissão 777
find / -type d -perm 0777

Performance

Para buscas rápidas, limite o escopo com -maxdepth e -mindepth. Evite usar -exec com comandos lentos; prefira xargs ou -exec ... +. O find também pode usar -prune para pular diretórios.

Exemplo: find / -maxdepth 3 -name "*.conf" busca apenas até 3 níveis. Para ignorar diretórios como /proc e /sys: find / -path /proc -prune -o -type f -print.

# Limitar profundidade
find / -maxdepth 2 -name "*.log"

# Usar xargs para processamento em lote (mais eficiente que -exec)
find /var -name "*.log" -type f | xargs -P 4 gzip

# Pular diretórios (prune)
find / -path /mnt -prune -o -name "*.txt" -print

Boas práticas

Sempre teste o comando sem ação destrutiva primeiro. Use -print para ver o que será afetado. Evite find / sem critérios restritivos. Prefira caminhos específicos. Use aspas nos padrões para evitar expansão do shell. Considere o uso de locate para buscas rápidas por nome (baseado em índice).

Exercícios

  1. Encontre todos os arquivos com extensão .bak no diretório /home e os delete.
  2. ✓ Resposta:
    find /home -type f -name "*.bak" -exec rm {} \;
  3. Liste todos os diretórios vazios no diretório /var.
  4. ✓ Resposta:
    find /var -type d -empty
  5. Encontre arquivos maiores que 100 MB e menores que 500 MB em todo o sistema, mas ignorando o diretório /mnt.
  6. ✓ Resposta:
    find / -path /mnt -prune -o -type f -size +100M -size -500M -print
  7. Use -exec para copiar todos os arquivos .jpg do diretório atual para /backup, preservando a estrutura de diretórios.
  8. ✓ Resposta:
    find . -name "*.jpg" -exec cp --parents {} /backup \;
  9. Encontre arquivos modificados nos últimos 3 dias que pertencem ao usuário 'aluno' e tenham permissão 644.
  10. ✓ Resposta:
    find /home -user aluno -type f -perm 644 -mtime -3

Referências