Domine padrões de busca no Linux — de wildcards do shell a filtros poderosos com grep.
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.
💡 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.
? — Exatamente Um CaracterePode ser letra, número ou símbolo — mas obrigatoriamente um. Não substitui "nada".
file?.txt — combinafile?.txt — NÃO combina✅ Use ? quando você sabe exatamente quantos caracteres podem variar. Para quantidades variáveis, prefira *.
* — Zero ou Mais CaracteresPode combinar com nada, com um caractere ou com centenas. O curinga mais usado no dia a dia.
file*.txt — combinafile*.txt — NÃO combina? vs *[ ] — Conjunto EspecíficoPode 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)
✅ 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
{ } — Expansão MúltiplaNã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!)
[ ] vs { }Enquanto wildcards operam em nomes de arquivo, o grep filtra o conteúdo de arquivos usando Expressões Regulares (regex).
💡 Sintaxe: grep [opções] "padrão" arquivo
O grep retorna as linhas que combinam com o padrão.
+, ?, |)Regex é uma linguagem de padrões muito mais poderosa que os wildcards do shell. Usada dentro do grep, sed e awk.
⚠️ Atenção! O * do shell e o * do regex são diferentes! No shell, * = zero ou mais caracteres. No regex, * = zero ou mais rep. do caractere anterior.
| Símbolo | No Shell (Wildcard) | No Regex (grep) |
|---|---|---|
* |
Zero ou mais caracteres | Zero ou mais do char anterior |
? |
Exatamente 1 caractere | Zero ou um do char anterior |
. |
Literal (ponto mesmo) | Qualquer 1 caractere |
[abc] |
Um de: a, b ou c (igual) | Um de: a, b ou c (igual) |
^ |
Não tem equivalente | Início da linha |
O rm *.txt deleta arquivos de forma irreversível no Linux. Sempre use ls primeiro para ver o que será afetado!
⚠️ 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}.
Você é o administrador. Precisa organizar logs, criar estrutura de projeto e investigar acessos.
| 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 |
^ (regex) | Início da linha | grep "^root" | Linhas que começam com root |
$ (regex) | Fim da linha | grep "bash$" | Linhas que terminam com bash |
🛡️ Regra de Ouro: Sempre teste com ls ou echo antes de usar rm, mv ou cp com metacaracteres!
O que representa o metacaractere * no shell Bash?
* no shell = zero ou mais caracteres: ls *.txt lista todos os .txt. Cuidado: no regex, * significa zero ou mais do caractere anterior.Qual metacaractere representa exatamente um único caractere qualquer no shell?
? 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?
[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.Qual comando usa expressão regular para buscar linhas que começam com ‘root’ em /etc/passwd?
grep aceita regex: ^ ancora ao início da linha. Use grep -E (ou egrep) para regex estendida com +, ?, |.