⬅ Voltar ao Dashboard 1º Bimestre — Linux Básico
Aula 1.4

🔍 Metacaracteres e Expressões Regulares

Domine padrões de busca no Linux — de wildcards do shell a filtros poderosos com grep.

? Interrogação 1 caractere exato
* Asterisco Zero ou mais chars
[ ] Colchetes Conjunto específico
{ } Chaves Expansã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 exato user@linux:~$ ls arquivo1.txt arquivo1.txt # Com metacaractere — encontra vários de uma vez! user@linux:~$ ls arquivo*.txt arquivo1.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 caractere user@linux:~$ ls test?.log test1.log test2.log testA.log testX.log # Dois ?? = exatamente 2 caracteres user@linux:~$ ls doc??.pdf doc01.pdf docAB.pdf docXY.pdf # Uso real: backups com data formatada user@linux:~$ ls backup_202?-0?.tar backup_2023-01.tar backup_2024-05.tar backup_2024-09.tar
file?.txt — combina
file1.txt filea.txt fileX.txt file_.txt
file?.txt — NÃO combina
file.txt file12.txt fileABC.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*.conf dhcpd.conf debug.conf dns.conf # Qualquer arquivo que CONTENHA "log" user@linux:~$ ls *log* mylog.txt syslog.conf catalog.db login.sh
file*.txt — combina
file.txt file1.txt file12.txt fileABC.txt file_backup.txt
file*.txt — NÃO combina
file.pdf arquivofile.txt

⚖️ Quando Usar: ? vs *

?
Quantidade definida Sabe exatamente quantos
caracteres mudam
$ ls log??.txt # log01.txt a log99.txt
VS
*
Quantidade indefinida Não importa quantos
caracteres mudam
$ ls *.txt # todos os .txt
? vs * — diferença na prática
# Arquivos disponíveis: file.txt file1.txt file12.txt fileABC.txt user@linux:~$ ls file?.txt file1.txt # Só 1 caractere: pega apenas file1.txt user@linux:~$ ls file*.txt file.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ícita user@linux:~$ ls file[123].txt file1.txt file2.txt file3.txt # Intervalo: números de 1 a 5 user@linux:~$ ls arquivo[1-5].txt arquivo1.txt arquivo3.txt arquivo5.txt # Logs numerados de 00 a 99 user@linux:~$ ls log[0-9][0-9].txt log01.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

Casos clássicos: logs numerados log[0-9][0-9].txt — versões v[1-3].*.zip — combinar com asterisco [a-z]*[0-9].txt

🗂️ Chaves { } — Expansão Múltipla

{ } Expande em várias opções de uma só vez

Não filtra arquivos existentes — gera os nomes. Perfeito para criar vários arquivos/pastas de uma vez.

touch arquivo{1,2,3}.txt → arquivo1.txt, arquivo2.txt, arquivo3.txt
touch test{1..5}.txt → test1.txt, test2.txt ... test5.txt
mkdir -p projeto/{src,docs,tests} → 3 pastas criadas de uma vez
cp config.txt{,.backup} → config.txt.backup (backup rápido!)
chaves avançadas
# Passo: de 2 em 2 user@linux:~$ echo {0..10..2} 0 2 4 6 8 10 # Estrutura de projeto completa user@linux:~$ mkdir -p empresa{1,2}/{vendas,ti,rh} # Cria: empresa1/vendas, empresa1/ti, empresa1/rh, empresa2/... # Listar .conf OU .allow em /etc user@linux:~$ ls /etc/*{conf,allow} httpd.conf hosts.allow syslog.conf tcp.allow # Renomear extensão user@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 existe user@linux:~$ ls file[123].txt file1.txt file3.txt # file2.txt não existe → não aparece # { } = EXPANDE — gera todos os nomes user@linux:~$ echo file{1,2,3}.txt file1.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 primeiro user@linux:~$ ls *.txt arquivo1.txt importante.txt teste.txt # Confirme que são os arquivos certos user@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 2024 admin@srv:~$ ls log_2024*.txt log_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].txt log_2024-01.txt log_2024-02.txt ... log_2024-06.txt # 3. Criar estrutura de projeto em 1 comando admin@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 mysql admin@srv:~$ cp /etc/{apache2,nginx,mysql}/*.conf /backup/ # Copia configs dos 3 serviços de uma vez!

📋 Referência Rápida

? 1 char exato file?.txt
* 0 ou + chars *.log
[ ] Conjunto [0-9].txt
{ } Expansão {src,docs}
Metacaractere Significado Exemplo Resultado
?Exatamente 1 charfile?.txtfile1.txt, filea.txt
*Zero ou + chars*.logsystem.log, error.log
[abc]Um de: a, b ou ctest[123].txttest1.txt, test2.txt, test3.txt
[a-z]Intervalo: a até zfile[a-c].txtfilea.txt, fileb.txt, filec.txt
[^a]Qualquer, EXCETO a[^f]*Não começa com f
{a,b}Expande: a e b{doc,img}.zipdoc.zip, img.zip
{1..5}Intervalo automáticofile{1..5}.txtfile1.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:
bash — passo 1
usuario@servidor:~$ mkdir ~/lab-wildcards usuario@servidor:~$ cd ~/lab-wildcards usuario@servidor:~/lab-wildcards$ touch relatorio{1..5}.txt usuario@servidor:~/lab-wildcards$ touch log{01..12}.txt usuario@servidor:~/lab-wildcards$ touch config.{conf,bak,old} usuario@servidor:~/lab-wildcards$ ls
2
Praticar * — zero ou mais caracteres
Primeiro nos arquivos que você criou, depois em arquivos reais do sistema que existem em qualquer Ubuntu Server:
bash — passo 2
# Nos seus arquivos criados usuario@servidor:~/lab-wildcards$ ls *.txt usuario@servidor:~/lab-wildcards$ ls relatorio*.txt usuario@servidor:~/lab-wildcards$ ls config.* # Em arquivos reais do sistema usuario@servidor:~/lab-wildcards$ ls /etc/*.conf usuario@servidor:~/lab-wildcards$ ls /var/log/*.log usuario@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.txt usuario@servidor:~/lab-wildcards$ ls log??.txt # relatorio com exatamente 1 dígito: relatorio1.txt .. relatorio5.txt usuario@servidor:~/lab-wildcards$ ls relatorio?.txt # Runlevels do sistema: rc0.d rc1.d rc2.d ... rc6.d usuario@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 5 usuario@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 apenas usuario@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 /tmp usuario@servidor:~/lab-wildcards$ cp /etc/{hosts,hostname} /tmp/ usuario@servidor:~/lab-wildcards$ ls /tmp/ # Backup rápido do config.conf → config.conf.bak usuario@servidor:~/lab-wildcards$ cp config.conf{,.bak} usuario@servidor:~/lab-wildcards$ ls config.* # Listar passwd, group e shadow juntos usuario@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 lab usuario@servidor:~/lab-wildcards$ rm *.txt usuario@servidor:~/lab-wildcards$ ls # Remove o diretório inteiro ao final usuario@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.