Expansão de Chaves: {1..10} e Mais

Expansão de Chaves: {1..10} e Mais

O Que Você Vai Aprender

  • O que a expansão de chaves realmente faz
  • Como escrever {1..10} (sequências) e {a,b,c} (listas)
  • Como combinar com mkdir e cp para reduzir trabalho repetitivo a uma linha
  • A diferença principal entre expansão de chaves e * (curingas)

Resumo Rápido

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

1. O Que É Expansão de Chaves?

Conclusão: Expansão de chaves é um recurso do bash que expande { } em múltiplas strings de uma vez.

Lina: Senpai, quero criar file1.txt até file5.txt. Preciso mesmo digitar touch file1.txt cinco vezes?
Veterano Linny: Não, existe uma forma muito mais fácil. Olhe isso.
Veterano Linny: touch file{1..5}.txt
Lina: Espere, apenas uma linha? O que é {1..5}?
Veterano Linny: Esse é o tema de hoje: expansão de chaves. O shellUm programa interativo que interpreta os comandos digitados e os executa. expande o que está 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, é perfeito para inspecionar o resultado de uma expansão.

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

O que a expansão de chaves realmente é

O shell expande o conteúdo de { } em múltiplas strings antes de executar o comando. Então touch file{1..5}.txt é o mesmo que executar touch file1.txt file2.txt file3.txt file4.txt file5.txt.

2. Criando Sequências: {inicio..fim}

Conclusão: {1..10} gera a sequência de 1 a 10. Letras, ordem decrescente e intervalos invertidos usam a mesma sintaxe.

2-1. Sequências numéricas

$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
Lina: Então .. (dois pontos) significa "daqui até aqui."
Veterano Linny: Exatamente. {inicio..fim} cria uma sequência. O detalhe é que são dois pontos, não uma vírgula.

2-2. Sequências de letras

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

2-3. Ordem decrescente também funciona

Faça o fim menor que o início, e a ordem se inverte.

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

3. Zero à Esquerda e Incremento

Conclusão: {01..10} adiciona zeros à esquerda, e {1..10..2} define o incremento (passo).

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

Quando você quer que nomes de arquivo fiquem alinhados, comece o número com 0 para adicionar zeros à esquerda.

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

Zeros à esquerda mantêm a ordenação estável. 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}

Conclusão: {a,b,c} apresenta palavras separadas por vírgula como estão. Use quando os itens não são uma sequência.

Quando você quer apresentar um conjunto fixo de palavras em vez de uma sequência, use vírgulas.

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

Não coloque espaços ao redor das vírgulas

Escrever {a, b, c} com espaços quebra a expansão de chaves, e é tratado como texto simples. Escreva {a,b,c} sem espaços.

Lina: Então .. é para sequências e , é para listas. Entendi a distinção.
Veterano Linny: Ótimo. Escrever {1..100} como {1,2,3,...,100} seria doloroso, então use sequência para isso, e lista para um punhado de palavras fixas.

5. Prefixos, Sufixos e Combinações

Conclusão: Texto antes ou depois das chaves é distribuído para cada item. Múltiplas chaves lado a lado geram todas as combinações.

5-1. Prefixo e sufixo

Texto antes ou depois das chaves é distribuído para cada item.

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

5-2. Múltiplas chaves (produto cartesiano)

Coloque duas ou mais chaves lado a lado e você obtém todas as combinações.

$ echo {A,B}{1,2}
A1 A2 B1 B2
Lina: 2 x 2 dá todas as 4 combinações.
Veterano Linny: Certo, isso se chama "produto cartesiano." É útil para gerar combinações de linha x coluna de uma vez, como um mapa de assentos ({A,B,C}{1,2,3,4}).

6. Técnicas Que Compensam no Trabalho

Conclusão: Criação de diretórios em massa, backups e renomeações são padrões clássicos que você pode reduzir a uma linha com expansão de chaves.

6-1. Criar diretórios de uma vez

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

Isso cria src, test e docs dentro de project de uma só vez. -p significa "criar diretórios pai se não existirem."

6-2. Fazer um backup instantaneamente

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

$ cp config.yml{,.bak}

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

É 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 também 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. Expansão de Chaves vs. * (Curingas)

Conclusão: Expansão de chaves "gera" strings. * "corresponde" a arquivos existentes. Gerar algo que ainda não existe é o que torna a expansão de chaves especial.

Lina: * também lida com múltiplos arquivos de uma vez. Qual é a diferença?
Veterano Linny: Existe uma diferença importante. * procura arquivos que existem agora e os corresponde. Mas expansão de chaves cria strings mesmo se nenhum arquivo existe. Por isso você pode escrever nomes para arquivos que está prestes a criar.

Gerar (chaves) ou corresponder (glob)?

Sintaxe Comportamento Quando nenhum arquivo existe
{1..3}.txt Gera strings strings ainda são criadas
*.txt Corresponde arquivos existentes não corresponde a nada

touch file{1..3}.txt (prestes a criar) funciona. touch file*.txt (ainda não existem) não fará o que você quer.

8. Armadilhas Comuns

Conclusão: Espaços perdidos, usar variáveis diretamente e a contagem de pontos são os erros clássicos. Para usar uma $variavel em um intervalo, use seq ou eval.

8-1. Colocar espaço dentro

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

Um espaço impede que seja reconhecido como expansão de chaves, e imprime como está. Escreva {1..3} sem espaços.

8-2. Você não pode usar uma variável diretamente em um intervalo

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

A expansão de chaves executa antes da expansão de variáveis, então $n em {1..$n} ainda não é um número. Para iterar sobre um intervalo com uma variável, use seq.

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

8-3. Um único ponto não é uma sequência

{1.5} com um único ponto não é uma sequência. Uma sequência sempre usa dois pontos ({1..5}).

9. Mini Exercícios: Tente Você Mesmo

Conclusão: Três tarefas (arquivos numerados, diretórios em massa, backup) permitem que você verifique o básico da expansão de chaves na prática.

Lina: Quero aprender fazendo.
Veterano Linny: Ótimo, preparei três. 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 até day07.log.

Mostrar dica

Combine a sequência com zero à esquerda {01..07} com touch.

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

Tarefa 2: Crie bin, lib, conf e log dentro de um diretórioUm local que organiza arquivos. É a mesma ideia da "pasta" do Windows ou macOS. 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: Faça um backup notes.md.bak de notes.md com um único comando.

Mostrar dica

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

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

10. Templates Para Copiar e Colar

Conclusão: Mantenha à mão os padrões comuns para sequências, listas, combinações e backups.

Padrões úteis 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

Próximas Leituras