Localizando arquivos com find
Esta aula ensina a localizar arquivos no Linux usando o comando find, cobrindo filtros por nome, tipo e tamanho, execução de comandos com -exec, combinação de critérios e dicas de performance. O conteúdo inclui exemplos práticos e exercícios com respostas interativas.
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
- Encontre todos os arquivos com extensão
.logno diretório/var/logque tenham mais de 10 MB. - Liste todos os diretórios vazios dentro de
/home. - Use
-execpara alterar a permissão de todos os scripts.shem/usr/local/binpara 755. - Encontre arquivos que não sejam diretórios e que tenham tamanho entre 1 MB e 10 MB.
- Explique a diferença entre
-exec rm {} \;e-delete. Dê um exemplo de uso seguro.
find /var/log -name "*.log" -size +10M
find /home -type d -empty
find /usr/local/bin -name "*.sh" -exec chmod 755 {} \;
find . -type f -size +1M -a -size -10M
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.