Domine padrões de busca no Linux — de wildcards do shell a filtros poderosos com grep.
?Interrogação1 caractere exato
*AsteriscoZero ou mais chars
[ ]ColchetesConjunto específico
{ }ChavesExpansão múltipla
📚 O que São Metacaracteres?
Metacaracteres são símbolos especiais que o shell interpreta antes de executar o comando. Em vez de buscar o símbolo literalmente, o shell os usa como padrões de busca.
sem e com metacaracteres
# Sem metacaracteres — só encontra o nome exatouser@linux:~$ls arquivo1.txtarquivo1.txt# Com metacaractere — encontra vários de uma vez!user@linux:~$ls arquivo*.txtarquivo1.txt arquivo2.txt arquivoX.txt arquivo_backup.txt# O shell expande o padrão antes de executar ls
💡 Como funciona: O shell vê arquivo*.txt, expande para todos os arquivos que combinam, e só então passa a lista para o comando. O comando nunca vê o metacaractere — já recebe os nomes prontos.
❓ Símbolo ? — Exatamente Um Caractere
?Substitui exatamente 1 caractere qualquer
Pode ser letra, número ou símbolo — mas obrigatoriamente um. Não substitui "nada".
exemplos com ?
# 1 interrogação = exatamente 1 caractereuser@linux:~$ls test?.logtest1.log test2.log testA.log testX.log# Dois ?? = exatamente 2 caracteresuser@linux:~$ls doc??.pdfdoc01.pdf docAB.pdf docXY.pdf# Uso real: backups com data formatadauser@linux:~$ls backup_202?-0?.tarbackup_2023-01.tar backup_2024-05.tar backup_2024-09.tar
✅ file?.txt — combina
file1.txtfilea.txtfileX.txtfile_.txt
❌ file?.txt — NÃO combina
file.txtfile12.txtfileABC.txt
✅ Use ? quando você sabe exatamente quantos caracteres podem variar. Para quantidades variáveis, prefira *.
⭐ Símbolo * — Zero ou Mais Caracteres
*Substitui zero ou mais caracteres — o mais flexível
Pode combinar com nada, com um caractere ou com centenas. O curinga mais usado no dia a dia.
exemplos com *
# Tudo que começa com "backup"user@linux:~$ls backup*backup backup.tar backup_2024.zip backup_completo.tar.gz# Todos os .conf em /etc que começam com 'd'user@linux:~$ls /etc/d*.confdhcpd.conf debug.conf dns.conf# Qualquer arquivo que CONTENHA "log"user@linux:~$ls *log*mylog.txt syslog.conf catalog.db login.sh
# Arquivos disponíveis: file.txt file1.txt file12.txt fileABC.txtuser@linux:~$ls file?.txtfile1.txt# Só 1 caractere: pega apenas file1.txtuser@linux:~$ls file*.txtfile.txt file1.txt file12.txt fileABC.txt# Zero ou mais: pega todos!
📋 Colchetes [ ] — Conjunto Específico
[ ]Escolhe 1 caractere de um conjunto definido por você
Pode ser uma lista ([abc]), um intervalo ([a-z]) ou uma negação ([^abc]).
[a-z]Letras minúsculas
[A-Z]Letras maiúsculas
[0-9]Dígitos
[a-zA-Z]Qualquer letra
[0-9a-f]Hexadecimal
[^0-9]Não-número (negação)
exemplos com [ ]
# Só aceita 1, 2 ou 3 — lista explícitauser@linux:~$ls file[123].txtfile1.txt file2.txt file3.txt# Intervalo: números de 1 a 5user@linux:~$ls arquivo[1-5].txtarquivo1.txt arquivo3.txt arquivo5.txt# Logs numerados de 00 a 99user@linux:~$ls log[0-9][0-9].txtlog01.txt log15.txt log42.txt log99.txt# Negação: arquivos que NÃO começam com 'a' ou 'b'user@linux:~$ls [^ab]*config.txt documento.pdf foto.jpg
# Passo: de 2 em 2user@linux:~$echo {0..10..2}0 2 4 6 8 10# Estrutura de projeto completauser@linux:~$mkdir -p empresa{1,2}/{vendas,ti,rh}# Cria: empresa1/vendas, empresa1/ti, empresa1/rh, empresa2/...# Listar .conf OU .allow em /etcuser@linux:~$ls /etc/*{conf,allow}httpd.conf hosts.allow syslog.conf tcp.allow# Renomear extensãouser@linux:~$mv foto{.jpg,.jpeg}# foto.jpg → foto.jpeg
⚖️ Diferença Crucial: [ ] vs { }
📋 [ ] Colchetes — FILTRA
Escolhe 1 caractere do conjunto
Só mostra se o arquivo já existir
Usa: buscar/filtrar arquivos
🗂️ { } Chaves — EXPANDE
Gera várias palavras completas
Mostra todos os nomes, existindo ou não
Usa: criar/nomear arquivos e pastas
[ ] vs { } na prática
# [ ] = FILTRA — só mostra o que existeuser@linux:~$ls file[123].txtfile1.txt file3.txt# file2.txt não existe → não aparece# { } = EXPANDE — gera todos os nomesuser@linux:~$echo file{1,2,3}.txtfile1.txt file2.txt file3.txt# Mostra todos, existam ou não
🚨 Erros Comuns e Como Evitar
🔥 PERIGOSO: rm com wildcard sem verificar
O rm *.txt deleta arquivos de forma irreversível no Linux. Sempre use ls primeiro para ver o que será afetado!
regra de ouro — ls antes do rm
# ❌ PERIGOSO: pode deletar arquivos importantes!rm *.txt# ✅ SEGURO: veja o que vai ser afetado primeirouser@linux:~$ls *.txtarquivo1.txt importante.txt teste.txt# Confirme que são os arquivos certosuser@linux:~$rm *.txt# Agora sim!
⚠️ Erro 1 — Confundir ? com *:file?.txt não encontra file.txt (zero caracteres). Use file*.txt para incluir zero chars.
⚠️ Erro 2 — Intervalo invertido:[z-a] está errado (ordem decrescente). Use sempre [a-z] (ordem crescente).
⚠️ Erro 3 — Confundir [ ] com { }:[1,2,3] não é lista de opções, é conjunto de chars. Para lista de opções use {1,2,3}.
🎯 Caso Prático: Administrando um Servidor
Você é o administrador. Precisa organizar logs, criar estrutura de projeto e investigar acessos.
admin@servidor — situações reais
# 1. Ver todos os logs de 2024admin@srv:~$ls log_2024*.txtlog_2024-01.txt log_2024-02.txt log_2024-03.txt ...# 2. Logs só do primeiro semestre (meses 01 a 06)admin@srv:~$ls log_2024-0[1-6].txtlog_2024-01.txt log_2024-02.txt ... log_2024-06.txt# 3. Criar estrutura de projeto em 1 comandoadmin@srv:~$mkdir -p projeto_web/{html,css,js,img}/{dev,prod}# Cria 8 pastas organizadas de uma vez!# 4. Backup das configs de apache, nginx e mysqladmin@srv:~$cp /etc/{apache2,nginx,mysql}/*.conf /backup/# Copia configs dos 3 serviços de uma vez!
📋 Referência Rápida
?1 char exatofile?.txt
*0 ou + chars*.log
[ ]Conjunto[0-9].txt
{ }Expansão{src,docs}
Metacaractere
Significado
Exemplo
Resultado
?
Exatamente 1 char
file?.txt
file1.txt, filea.txt
*
Zero ou + chars
*.log
system.log, error.log
[abc]
Um de: a, b ou c
test[123].txt
test1.txt, test2.txt, test3.txt
[a-z]
Intervalo: a até z
file[a-c].txt
filea.txt, fileb.txt, filec.txt
[^a]
Qualquer, EXCETO a
[^f]*
Não começa com f
{a,b}
Expande: a e b
{doc,img}.zip
doc.zip, img.zip
{1..5}
Intervalo automático
file{1..5}.txt
file1.txt até file5.txt
🛡️ Regra de Ouro: Sempre teste com ls ou echo antes de usar rm, mv ou cp com metacaracteres!
🛠️ Atividade Prática — Wildcards no Ubuntu Server
⏱️ ~30 min💻 Ubuntu Server 20.04📸 Tirar screenshot da saída
1
Criar ambiente de teste
Crie um diretório de laboratório e popule-o com arquivos para praticar. O {} já é um wildcard — veja como ele cria vários arquivos de uma vez:
Primeiro nos arquivos que você criou, depois em arquivos reais do sistema que existem em qualquer Ubuntu Server:
bash — passo 2
# Nos seus arquivos criadosusuario@servidor:~/lab-wildcards$ls *.txt
usuario@servidor:~/lab-wildcards$ls relatorio*.txt
usuario@servidor:~/lab-wildcards$ls config.*
# Em arquivos reais do sistemausuario@servidor:~/lab-wildcards$ls/etc/*.confusuario@servidor:~/lab-wildcards$ls/var/log/*.logusuario@servidor:~/lab-wildcards$ls~/.bash*
3
Praticar ? — exatamente 1 caractere
Use ? para ser preciso: log??.txt filtra apenas logs com 2 dígitos. Teste também em diretórios reais do sistema:
bash — passo 3
# log com exatamente 2 dígitos: log01.txt .. log12.txtusuario@servidor:~/lab-wildcards$ls log??.txt
# relatorio com exatamente 1 dígito: relatorio1.txt .. relatorio5.txtusuario@servidor:~/lab-wildcards$ls relatorio?.txt
# Runlevels do sistema: rc0.d rc1.d rc2.d ... rc6.dusuario@servidor:~/lab-wildcards$ls/etc/rc?.d# Discos detectados pelo kernel: sda, sdb...usuario@servidor:~/lab-wildcards$ls/dev/sd?
4
Praticar [ ] — conjuntos e intervalos
Use conjuntos para filtrar com mais controle. Compare: [135] aceita só os listados; [1-5] aceita o intervalo inteiro:
bash — passo 4
# Apenas relatórios 1, 3 e 5usuario@servidor:~/lab-wildcards$ls relatorio[135].txt
# Logs do mês 01 ao 06 (primeiro semestre)usuario@servidor:~/lab-wildcards$ls log0[1-6].txt
# Runlevels de inicialização 0, 1 e 2 apenasusuario@servidor:~/lab-wildcards$ls/etc/rc[012].d# Arquivos de config que NÃO começam com 'c'usuario@servidor:~/lab-wildcards$ls [^c]*.conf /etc/[^c]*.conf
5
Praticar { } — expansão de listas
Use chaves para operar em múltiplos alvos de uma vez. O truque arquivo{,.bak} faz backup sem redigitar o nome:
bash — passo 5
# Copiar hosts e hostname de uma vez para /tmpusuario@servidor:~/lab-wildcards$cp/etc/{hosts,hostname}/tmp/usuario@servidor:~/lab-wildcards$ls/tmp/# Backup rápido do config.conf → config.conf.bakusuario@servidor:~/lab-wildcards$cp config.conf{,.bak}
usuario@servidor:~/lab-wildcards$ls config.*
# Listar passwd, group e shadow juntosusuario@servidor:~/lab-wildcards$ls-l/etc/{passwd,group,shadow}
6
Limpeza — remover com wildcard (com cuidado!)
Sempre confirme com ls antes de usar rm com wildcards. Use o ambiente de teste criado no passo 1 para praticar com segurança:
bash — passo 6
# ✅ SEMPRE verifique antes de remover!usuario@servidor:~/lab-wildcards$ls *.txt
usuario@servidor:~/lab-wildcards$ls *.conf
# Agora sim: remove só os .txt do labusuario@servidor:~/lab-wildcards$rm *.txt
usuario@servidor:~/lab-wildcards$ls# Remove o diretório inteiro ao finalusuario@servidor:~/lab-wildcards$cd ~
usuario@servidor:~$rm-r~/lab-wildcards
Escreva um comando que liste, em ordem alfabética, os logs .log de /var/log que começam com a ou k, e também os arquivos hosts e resolv.conf de /etc. Use [ ], { } e | em uma única linha:
$
📌 Para refletir: wildcards não são apenas atalhos — são a forma como administradores operam em dezenas ou centenas de arquivos de uma vez. Um ls /etc/*.conf ou ls /var/log/*.log é algo que você vai usar toda semana num servidor real.
❓ Verifique seu Conhecimento
O que representa o metacaractere * no shell Bash?
AQualquer caractere exatamente uma vez
BZero ou mais caracteres quaisquer (wildcard)
CApenas dígitos numéricos
DO início de uma linha
✓ * no shell = zero ou mais caracteres: ls *.txt lista todos os .txt.
Qual metacaractere representa exatamente um único caractere qualquer no shell?
A*
B+
C?
D.
✓ O ? no shell substitui exatamente 1 caractere: ls arquivo?.txt encontra arquivo1.txt, arquivoA.txt, mas não arquivo10.txt (2 chars).
O que faz o comando ls [abc]*.txt?
ALista arquivos .txt que começam com a, b ou c
BLista arquivos cujos nomes contêm [abc] literalmente
CLista arquivos .txt que terminam com a, b ou c
DLista arquivos com extensão abc.txt
✓ [abc] combina um único caractere que seja a, b ou c. Combinado com * = tudo que começa com a, b ou c. Use [a-z] para intervalos.