Expansao de Chaves: {1..10} e Mais

Expansao de Chaves: {1..10} e Mais

O Que Voce Vai Aprender

  • O que a expansao de chaves realmente faz
  • Como escrever {1..10} (sequencias) e {a,b,c} (listas)
  • Como combinar com mkdir e cp para reduzir trabalho repetitivo a uma linha
  • A diferenca principal entre expansao de chaves e * (curingas)

Resumo Rapido

  • Precisa de uma sequencia -> {1..10}
  • Precisa de um conjunto fixo de palavras -> {a,b,c}
  • Fazer um backup -> cp file.txt{,.bak}

1. O Que E Expansao de Chaves?

Conclusao: Expansao de chaves e um recurso do bash que expande { } em multiplas strings de uma vez.

Lina: Senpai, quero criar file1.txt ate file5.txt. Preciso mesmo digitar touch file1.txt cinco vezes?
Veterano Linny: Nao, existe uma forma muito mais facil. Olhe isso.
Veterano Linny: touch file{1..5}.txt
Lina: Espere, apenas uma linha? O que e {1..5}?
Veterano Linny: Esse e o tema de hoje: expansao de chaves. O shell expande o que esta dentro de { } (as chaves), transformando em cinco strings: file1.txt file2.txt file3.txt file4.txt file5.txt.

Vamos ver o que realmente acontece com echo. Como echo simplesmente imprime as strings que recebe, e perfeito para inspecionar o resultado de uma expansao.

$ echo file{1..5}.txt
file1.txt file2.txt file3.txt file4.txt file5.txt

O que a expansao de chaves realmente e

O shell expande o conteudo de { } em multiplas strings antes de executar o comando. Entao touch file{1..5}.txt e o mesmo que executar touch file1.txt file2.txt file3.txt file4.txt file5.txt.

2. Criando Sequencias: {inicio..fim}

Conclusao: {1..10} gera a sequencia de 1 a 10. Letras, ordem decrescente e intervalos invertidos usam a mesma sintaxe.

2-1. Sequencias numericas

$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
Lina: Entao .. (dois pontos) significa "daqui ate aqui."
Veterano Linny: Exatamente. {inicio..fim} cria uma sequencia. O detalhe e que sao dois pontos, nao uma virgula.

2-2. Sequencias de letras

$ echo {a..e}
a b c d e

2-3. Ordem decrescente tambem funciona

Faca o fim menor que o inicio, e a ordem se inverte.

$ echo {5..1}
5 4 3 2 1

3. Zero a Esquerda e Incremento

Conclusao: {01..10} adiciona zeros a esquerda, e {1..10..2} define o incremento (passo).

3-1. Zero a esquerda (alinhamento de largura)

Quando voce quer que nomes de arquivo fiquem alinhados, comece o numero com 0 para adicionar zeros a esquerda.

$ echo {01..10}
01 02 03 04 05 06 07 08 09 10

Zeros a esquerda mantem a ordenacao estavel. file1 file2 ... file10 ordena como file1, file10, file2... por nome, mas file01 file02 ... file10 ordena da forma esperada.

3-2. Especificando um passo

{inicio..fim..passo} controla quanto pular cada vez.

$ echo {0..20..5}
0 5 10 15 20
$ echo {1..10..2}
1 3 5 7 9

4. Criando Listas: {a,b,c}

Conclusao: {a,b,c} apresenta palavras separadas por virgula como estao. Use quando os itens nao sao uma sequencia.

Quando voce quer apresentar um conjunto fixo de palavras em vez de uma sequencia, use virgulas.

$ echo {apple,banana,cherry}
apple banana cherry

Nao coloque espacos ao redor das virgulas

Escrever {a, b, c} com espacos quebra a expansao de chaves, e e tratado como texto simples. Escreva {a,b,c} sem espacos.

Lina: Entao .. e para sequencias e , e para listas. Entendi a distincao.
Veterano Linny: Otimo. Escrever {1..100} como {1,2,3,...,100} seria doloroso, entao use sequencia para isso, e lista para um punhado de palavras fixas.

5. Prefixos, Sufixos e Combinacoes

Conclusao: Texto antes ou depois das chaves e distribuido para cada item. Multiplas chaves lado a lado geram todas as combinacoes.

5-1. Prefixo e sufixo

Texto antes ou depois das chaves e distribuido para cada item.

$ echo image_{1..3}.png
image_1.png image_2.png image_3.png

5-2. Multiplas chaves (produto cartesiano)

Coloque duas ou mais chaves lado a lado e voce obtem todas as combinacoes.

$ echo {A,B}{1,2}
A1 A2 B1 B2
Lina: 2 x 2 da todas as 4 combinacoes.
Veterano Linny: Certo, isso se chama "produto cartesiano." E util para gerar combinacoes de linha x coluna de uma vez, como um mapa de assentos ({A,B,C}{1,2,3,4}).

6. Tecnicas Que Compensam no Trabalho

Conclusao: Criacao de diretorios em massa, backups e renomeacoes sao padroes classicos que voce pode reduzir a uma linha com expansao de chaves.

6-1. Criar diretorios de uma vez

$ mkdir -p project/{src,test,docs}

Isso cria src, test e docs dentro de project de uma so vez. -p significa "criar diretorios pai se nao existirem."

6-2. Fazer um backup instantaneamente

Um lado da chave pode ser vazio. {,.bak} gera "nao adicionar nada" e "adicionar .bak."

$ cp config.yml{,.bak}

O que cp config.yml{,.bak} faz

E o mesmo que este comando:

$ cp config.yml config.yml.bak

{,.bak} se expande para config.yml e config.yml.bak, formando cp origem destino.

6-3. Renomear tambem funciona

$ mv report.txt{,_old}

Isso renomeia report.txt para report.txt_old. Sem necessidade de digitar o mesmo nome de arquivo duas vezes.

7. Expansao de Chaves vs. * (Curingas)

Conclusao: Expansao de chaves "gera" strings. * "corresponde" a arquivos existentes. Gerar algo que ainda nao existe e o que torna a expansao de chaves especial.

Lina: * tambem lida com multiplos arquivos de uma vez. Qual e a diferenca?
Veterano Linny: Existe uma diferenca importante. * procura arquivos que existem agora e os corresponde. Mas expansao de chaves cria strings mesmo se nenhum arquivo existe. Por isso voce pode escrever nomes para arquivos que esta prestes a criar.

Gerar (chaves) ou corresponder (glob)?

Sintaxe Comportamento Quando nenhum arquivo existe
{1..3}.txt Gera strings strings ainda sao criadas
*.txt Corresponde arquivos existentes nao corresponde a nada

touch file{1..3}.txt (prestes a criar) funciona. touch file*.txt (ainda nao existem) nao fara o que voce quer.

8. Armadilhas Comuns

Conclusao: Espacos perdidos, usar variaveis diretamente e a contagem de pontos sao os erros classicos. Para usar uma $variavel em um intervalo, use seq ou eval.

8-1. Colocar espaco dentro

$ echo { 1..3 }
{ 1..3 }

Um espaco impede que seja reconhecido como expansao de chaves, e imprime como esta. Escreva {1..3} sem espacos.

8-2. Voce nao pode usar uma variavel diretamente em um intervalo

$ n=5
$ echo {1..$n}
{1..5}

A expansao de chaves executa antes da expansao de variaveis, entao $n em {1..$n} ainda nao e um numero. Para iterar sobre um intervalo com uma variavel, use seq.

$ echo $(seq 1 $n)
1 2 3 4 5

8-3. Um unico ponto nao e uma sequencia

{1.5} com um unico ponto nao e uma sequencia. Uma sequencia sempre usa dois pontos ({1..5}).

9. Mini Exercicios: Tente Voce Mesmo

Conclusao: Tres tarefas (arquivos numerados, diretorios em massa, backup) permitem que voce verifique o basico da expansao de chaves na pratica.

Lina: Quero aprender fazendo.
Veterano Linny: Otimo, preparei tres. Antes de executar de verdade, prefixe com echo para verificar o resultado primeiro.

Tarefa 1: Crie sete arquivos de log de uma vez, de day01.log ate day07.log.

Mostrar dica

Combine a sequencia com zero a esquerda {01..07} com touch.

Resposta exemplo
$ touch day{01..07}.log

Tarefa 2: Crie bin, lib, conf e log dentro de um diretorio myapp de uma vez.

Mostrar dica

Use a lista {bin,lib,conf,log} com mkdir -p.

Resposta exemplo
$ mkdir -p myapp/{bin,lib,conf,log}

Tarefa 3: Faca um backup notes.md.bak de notes.md com um unico comando.

Mostrar dica

Use uma chave com um lado vazio: {,.bak}.

Resposta exemplo
$ cp notes.md{,.bak}

10. Templates Para Copiar e Colar

Conclusao: Mantenha a mao os padroes comuns para sequencias, listas, combinacoes e backups.

Padroes uteis para ter por perto

# Criar arquivos numerados
touch file{1..10}.txt

# Sequencia com zero a esquerda
touch log{01..12}.txt

# Pular de 10 em 10
echo {0..100..10}

# Uma lista fixa de palavras
mkdir -p project/{src,test,docs}

# Todas as combinacoes (produto cartesiano)
echo {2025,2026}-{01..12}

# Fazer um backup
cp config.yml{,.bak}

# Verificacao de seguranca: prefixe com echo para visualizar antes de executar
echo touch file{1..10}.txt

Proximas Leituras