Localizando arquivos com find
A aula aborda o comando find no Linux, ensinando a localizar arquivos por nome, tipo e tamanho, executar ações com -exec, combinar critérios e otimizar a performance. Inclui exemplos práticos e exercícios com respostas.
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
- Encontre todos os arquivos com extensão .bak no diretório /home e os delete.
- Liste todos os diretórios vazios no diretório /var.
- Encontre arquivos maiores que 100 MB e menores que 500 MB em todo o sistema, mas ignorando o diretório /mnt.
- Use -exec para copiar todos os arquivos .jpg do diretório atual para /backup, preservando a estrutura de diretórios.
- Encontre arquivos modificados nos últimos 3 dias que pertencem ao usuário 'aluno' e tenham permissão 644.
find /home -type f -name "*.bak" -exec rm {} \;
find /var -type d -empty
find / -path /mnt -prune -o -type f -size +100M -size -500M -print
find . -name "*.jpg" -exec cp --parents {} /backup \;
find /home -user aluno -type f -perm 644 -mtime -3