Skip to main content

Find Cheat Sheet

·1935 words·10 mins
timEU
Author
timEU

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 - bytes
  • k - 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