O comando find é uma ferramenta poderosa para localizar arquivos e diretórios no Linux. Ele percorre hierarquias de diretórios aplicando critérios de busca e pode executar ações sobre os resultados. Nesta aula, você aprenderá a usar filtros por nome, tipo e tamanho, a executar comandos com -exec, combinar múltiplos critérios e otimizar a performance das buscas.

Por nome, tipo, tamanho

A forma mais comum de usar find é filtrar por nome. A opção -name permite buscar por padrões com curingas (*, ?). Para ignorar maiúsculas/minúsculas, use -iname. Exemplo:

find /home -name "*.txt"

Para buscar por tipo de arquivo, use -type seguido de letras: f para arquivos regulares, d para diretórios, l para links simbólicos, etc. Exemplo:

find /var/log -type f -name "*.log"

Filtrar por tamanho é feito com -size. Os sufixos comuns são c (bytes), k (kilobytes), M (megabytes), G (gigabytes). Use + para maior que, - para menor que. Exemplo: arquivos maiores que 100 MB:

find / -size +100M

-exec

O -exec permite executar um comando sobre cada arquivo encontrado. A sintaxe é -exec comando {} \;, onde {} é substituído pelo caminho do arquivo. Exemplo: remover arquivos .tmp:

find /tmp -name "*.tmp" -exec rm {} \;

Para evitar múltiplas execuções, use -exec ... + que agrupa os resultados. Exemplo: contar linhas de todos os .txt:

find . -name "*.txt" -exec wc -l {} +

Cuidado com caracteres especiais; use \; para escapar o ponto e vírgula.

Combinando critérios

É possível combinar múltiplos critérios com operadores lógicos. Por padrão, critérios consecutivos são unidos com -a (AND). Use -o para OR e ! para NOT. Exemplo: arquivos .txt ou .md com tamanho menor que 1 MB:

find . \( -name "*.txt" -o -name "*.md" \) -a -size -1M

Os parênteses devem ser escapados (\( e \)) para evitar interpretação pelo shell. Para negar, use ! ou -not. Exemplo: arquivos que não são diretórios:

find . -type f ! -name "*.bak"

Performance

Para buscas mais rápidas, limite a profundidade com -maxdepth e -mindepth. Exemplo: apenas no primeiro nível:

find /etc -maxdepth 1 -name "*.conf"

Evite usar -exec com comandos lentos para muitos arquivos; prefira xargs ou -exec ... +. Exemplo com xargs:

find . -name "*.log" -print0 | xargs -0 grep "error"

O -print0 separa nomes com caractere nulo, seguro para nomes com espaços. Use -fstype para ignorar sistemas de arquivos remotos (NFS) com -prune.

Boas práticas

Teste seus comandos find sem ações destrutivas primeiro, usando apenas -print. Sempre escapede caracteres especiais. Prefira -exec ... + para operações em lote. Use locate para buscas rápidas por nome (baseado em banco de dados), mas find é mais flexível.

Exercícios

  1. Encontre todos os arquivos com extensão .log no diretório /var/log que tenham mais de 10 MB.
  2. ✓ Resposta:
    find /var/log -name "*.log" -size +10M
  3. Liste todos os diretórios vazios dentro de /home.
  4. ✓ Resposta:
    find /home -type d -empty
  5. Use -exec para alterar a permissão de todos os scripts .sh em /usr/local/bin para 755.
  6. ✓ Resposta:
    find /usr/local/bin -name "*.sh" -exec chmod 755 {} \;
  7. Encontre arquivos que não sejam diretórios e que tenham tamanho entre 1 MB e 10 MB.
  8. ✓ Resposta:
    find . -type f -size +1M -a -size -10M
  9. Explique a diferença entre -exec rm {} \; e -delete. Dê um exemplo de uso seguro.
  10. ✓ Resposta:

    Ambos removem arquivos, mas -delete é mais eficiente e seguro (não requer \;). Exemplo: find /tmp -name "*.tmp" -delete. Use -delete apenas com critérios restritivos para evitar exclusões acidentais.

Referências