Posso garantir que não passo um dia sem fazer um FIND!
Sintaxe Básica #
find /caminho -name "arquivo.txt" # Buscar arquivo específico
find . -name "*.txt" # Buscar arquivos .txt no diretório atual
find /home -name "*.log" # Buscar arquivos .log em /home
find . -type f # Buscar apenas arquivos
find . -type d # Buscar apenas diretórios
find . -type l # Buscar apenas links simbólicos
Busca por Nome #
find . -name "arquivo.txt" # Nome exato
find . -name "*.txt" # Todos os arquivos .txt
find . -name "arq*" # Arquivos que começam com "arq"
find . -name "*config*" # Arquivos que contêm "config"
find . -iname "*.TXT" # Busca case-insensitive
find . -name "*.txt" -o -name "*.log" # Arquivos .txt OU .log
Busca por Tipo #
find . -type f # Arquivos regulares
find . -type d # Diretórios
find . -type l # Links simbólicos
find . -type c # Dispositivos de caractere
find . -type b # Dispositivos de bloco
find . -type p # Pipes nomeados (FIFOs)
find . -type s # Sockets
Busca por Tamanho #
find . -size +100M # Arquivos maiores que 100MB
find . -size -1k # Arquivos menores que 1KB
find . -size 50c # Arquivos com exatamente 50 bytes
find . -size +1G # Arquivos maiores que 1GB
find . -empty # Arquivos vazios
find . -type d -empty # Diretórios vazios
Unidades de tamanho:
c
- bytesk
- kilobytes (1024 bytes)M
- megabytes (1024k)G
- gigabytes (1024M)
Busca por Data/Tempo #
find . -mtime -7 # Modificados nos últimos 7 dias
find . -mtime +30 # Modificados há mais de 30 dias
find . -mtime 5 # Modificados exatamente há 5 dias
find . -atime -1 # Acessados no último dia
find . -ctime +7 # Criados há mais de 7 dias
Tipos de tempo:
-mtime
- tempo de modificação (modification time)-atime
- tempo de acesso (access time)-ctime
- tempo de mudança (change time)
Busca por Data em Minutos #
find . -mmin -60 # Modificados na última hora
find . -mmin +120 # Modificados há mais de 2 horas
find . -amin -30 # Acessados nos últimos 30 minutos
find . -cmin +60 # Alterados há mais de 1 hora
Busca por Permissões #
find . -perm 755 # Permissões exatas 755
find . -perm -644 # Pelo menos as permissões 644
find . -perm /u+w # Qualquer permissão de escrita do usuário
find . -perm -u=r # Usuário tem permissão de leitura
find . -executable # Arquivos executáveis
find . -readable # Arquivos legíveis
find . -writable # Arquivos graváveis
Busca por Proprietário #
find . -user joao # Arquivos do usuário "joao"
find . -group admin # Arquivos do grupo "admin"
find . -uid 1000 # Arquivos com UID 1000
find . -gid 1000 # Arquivos com GID 1000
find . -nouser # Arquivos sem proprietário válido
find . -nogroup # Arquivos sem grupo válido
Profundidade de Busca #
find . -maxdepth 1 -name "*.txt" # Buscar apenas no nível atual
find . -maxdepth 3 -name "*.log" # Buscar até 3 níveis de profundidade
find . -mindepth 2 -name "*.conf" # Buscar a partir do 2º nível
find / -maxdepth 2 -type d # Diretórios até 2 níveis da raiz
Exclusões #
find . -name "*.txt" -not -path "*/tmp/*" # Excluir arquivos em diretórios tmp
find . -name "*.log" ! -path "*/backup/*" # Sintaxe alternativa para exclusão
find . -type f -not -name "*.tmp" # Todos os arquivos exceto .tmp
find . -name "*" -prune -o -name "*.txt" -print # Excluir diretório específico
Ações com Arquivos Encontrados #
find . -name "*.txt" -print # Imprimir (ação padrão)
find . -name "*.log" -delete # Deletar arquivos encontrados
find . -name "*.bak" -exec rm {} \; # Executar comando para cada arquivo
find . -name "*.txt" -exec cp {} backup/ \; # Copiar arquivos encontrados
find . -type f -exec ls -l {} \; # Listar detalhes dos arquivos
Exec vs Exec Plus #
find . -name "*.txt" -exec grep "padrão" {} \; # Executar para cada arquivo
find . -name "*.txt" -exec grep "padrão" {} + # Passar múltiplos arquivos de uma vez
find . -name "*.log" -exec mv {} /backup/ \; # Mover cada arquivo individualmente
Xargs - Processamento Eficiente #
find . -name "*.txt" | xargs grep "padrão" # Buscar padrão em arquivos .txt
find . -name "*.log" | xargs rm # Remover arquivos .log
find . -type f -print0 | xargs -0 grep "texto" # Usar separador null (nomes com espaços)
find . -name "*.bak" | xargs -I {} mv {} /backup/ # Usar placeholder
Combinação de Critérios #
# Operador AND (implícito)
find . -name "*.txt" -size +1k # Arquivos .txt E maiores que 1k
# Operador OR
find . -name "*.txt" -o -name "*.log" # Arquivos .txt OU .log
# Operador NOT
find . -name "*.txt" -not -size +1M # Arquivos .txt que NÃO são maiores que 1M
# Combinações complexas com parênteses
find . \( -name "*.txt" -o -name "*.log" \) -size +1k
Busca por Conteúdo #
find . -type f -exec grep -l "padrão" {} \; # Arquivos que contêm "padrão"
find . -name "*.txt" -exec grep -H "erro" {} \; # Buscar "erro" em arquivos .txt
find . -type f | xargs grep "TODO" # Buscar "TODO" em todos os arquivos
Busca em Localizações Específicas #
find /var/log -name "*.log" -mtime -1 # Logs modificados hoje
find /home -name ".ssh" -type d # Diretórios .ssh em /home
find /etc -name "*.conf" -readable # Arquivos de configuração legíveis
find /tmp -type f -atime +7 -delete # Limpar arquivos antigos em /tmp
Busca por Extensões #
find . -name "*.jpg" -o -name "*.png" -o -name "*.gif" # Imagens
find . -regex ".*\.\(jpg\|png\|gif\)$" # Usar regex para extensões
find . -name "*.tar.gz" # Arquivos comprimidos
find . -name "Makefile" -o -name "*.mk" # Arquivos de build
Arquivos Duplicados #
# Encontrar arquivos com mesmo nome
find . -name "*.txt" -printf "%f\n" | sort | uniq -d
# Encontrar arquivos por tamanho (possíveis duplicados)
find . -type f -printf "%s %p\n" | sort -n
# Usando comando auxiliar para MD5
find . -type f -exec md5sum {} \; | sort | uniq -d -w32
Casos de Uso Práticos #
Limpeza de Sistema #
# Remover arquivos temporários
find /tmp -type f -atime +7 -delete
# Limpar logs antigos
find /var/log -name "*.log" -mtime +30 -delete
# Remover arquivos de backup antigos
find . -name "*.bak" -mtime +7 -delete
# Encontrar arquivos grandes
find / -size +500M -type f -exec ls -lh {} \;
Desenvolvimento #
# Encontrar todos os arquivos de código
find . -name "*.py" -o -name "*.js" -o -name "*.java"
# Buscar TODOs no código
find . -name "*.py" -exec grep -Hn "TODO" {} \;
# Encontrar arquivos modificados recentemente
find . -name "*.c" -mtime -1
# Contar linhas de código
find . -name "*.py" | xargs wc -l
Administração de Sistema #
# Encontrar arquivos SUID
find / -perm -4000 -type f 2>/dev/null
# Encontrar diretórios world-writable
find / -type d -perm -002 2>/dev/null
# Arquivos sem proprietário
find / -nouser -o -nogroup 2>/dev/null
# Arquivos modificados nas últimas 24 horas
find /etc -mtime -1 -type f
Segurança #
# Encontrar arquivos com permissões perigosas
find / -perm -002 -type f 2>/dev/null
# Encontrar scripts executáveis world-writable
find / -perm -2 -name "*.sh" 2>/dev/null
# Arquivos modificados recentemente em diretórios do sistema
find /bin /sbin /usr/bin /usr/sbin -mtime -7 -type f
Backup e Sincronização #
# Encontrar arquivos para backup (modificados hoje)
find /home -mtime -1 -type f > arquivos_backup.list
# Arquivos maiores que determinado tamanho
find . -size +100M -type f -exec cp {} /backup/grandes/ \;
# Sincronizar arquivos modificados
find /dados -newer /backup/ultimo_sync -type f | xargs cp -t /backup/
Relatórios e Estatísticas #
# Contar arquivos por extensão
find . -type f | sed 's/.*\.//' | sort | uniq -c
# Listar os 10 maiores arquivos
find . -type f -exec ls -s {} \; | sort -n | tail -10
# Estatísticas de uso do disco por tipo
find . -name "*.jpg" -exec du -ch {} + | tail -1
find . -name "*.mp4" -exec du -ch {} + | tail -1
Printf - Formatação Personalizada #
find . -type f -printf "%p %s %TY-%Tm-%Td\n" # Nome, tamanho e data
find . -type f -printf "%f\t%s\n" # Nome do arquivo e tamanho
find . -type d -printf "%p/\n" # Diretórios com barra final
find . -printf "%M %u %g %s %p\n" # Permissões, usuário, grupo, tamanho, nome
Especificadores printf:
%p
- nome do arquivo com caminho%f
- nome do arquivo sem caminho%s
- tamanho em bytes%M
- permissões simbólicas%u
- nome do usuário%g
- nome do grupo%T
- tempo (Y=ano, m=mês, d=dia, H=hora, M=minuto, S=segundo)
Busca com Regex #
find . -regex ".*\.\(txt\|log\)$" # Arquivos .txt ou .log
find . -regex ".*/[0-9]{4}\.log$" # Logs com ano no nome
find . -iregex ".*readme.*" # Regex case-insensitive
Busca em Múltiplos Diretórios #
find /var/log /home/user/logs -name "*.log" # Buscar em múltiplos diretórios
find {/etc,/usr/local/etc} -name "*.conf" # Sintaxe com chaves
Otimização de Performance #
# Parar na primeira ocorrência
find . -name "arquivo.txt" -quit
# Usar -prune para pular diretórios
find . -path "./node_modules" -prune -o -name "*.js" -print
# Evitar atravessar filesystems
find . -mount -name "*.txt"
# Usar locate quando apropriado (mais rápido para buscas simples)
locate "*.txt" | head -10
Tratamento de Arquivos com Espaços #
# Usar -print0 e xargs -0
find . -name "*.txt" -print0 | xargs -0 grep "padrão"
# Usar aspas em exec
find . -name "*espaço*" -exec ls -l "{}" \;
# IFS para loops
find . -name "*.txt" -print0 | while IFS= read -r -d '' arquivo; do
echo "Processando: $arquivo"
done
Scripts com Find #
Script de Backup #
#!/bin/bash
# backup_recente.sh
DATA=$(date +%Y%m%d)
find /dados -mtime -1 -type f | tar -czf backup_$DATA.tar.gz -T -
echo "Backup criado: backup_$DATA.tar.gz"
Limpeza Automática #
#!/bin/bash
# limpeza.sh
echo "Removendo arquivos temporários..."
find /tmp -type f -atime +7 -delete
echo "Removendo logs antigos..."
find /var/log -name "*.log" -mtime +30 -delete
echo "Limpeza concluída"
Relatório de Sistema #
#!/bin/bash
# relatorio_arquivos.sh
echo "=== RELATÓRIO DE ARQUIVOS ==="
echo "Arquivos grandes (>100MB):"
find / -size +100M -type f -printf "%s %p\n" 2>/dev/null | sort -nr | head -10
echo -e "\nDiretórios vazios:"
find /home -type d -empty 2>/dev/null
echo -e "\nArquivos sem proprietário:"
find / -nouser -type f 2>/dev/null | head -10
Debugging Find #
# Usar -ls para ver detalhes
find . -name "*.txt" -ls
# Testar sem executar ações
find . -name "*.bak" -print # ao invés de -delete
# Verbose com set -x
set -x
find . -name "*.txt"
set +x
Dicas e Melhores Práticas #
Performance #
# Específico para geral
find . -name "arquivo.txt" -type f # Melhor que -type f -name "arquivo.txt"
# Use -maxdepth quando possível
find . -maxdepth 2 -name "*.txt"
# Evite buscar em diretórios desnecessários
find . -path "./backup" -prune -o -name "*.txt" -print
Segurança #
# Redirecione erros para não expor estrutura do sistema
find / -name "config" 2>/dev/null
# Use -quit para evitar busca exaustiva
find . -name "senha*" -quit
# Cuidado com -delete
find . -name "*.tmp" -print # Teste primeiro
find . -name "*.tmp" -delete # Execute depois
Portabilidade #
# Use -exec rm {} \; em vez de -delete para compatibilidade
# Use [ ] em vez de -regex para maior compatibilidade
# Evite -printf em sistemas não-GNU