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
mkdirecppara 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.
file1.txt ate file5.txt. Preciso mesmo digitar touch file1.txt cinco vezes?touch file{1..5}.txt{1..5}?{ } (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}.txtfile1.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
.. (dois pontos) significa "daqui ate aqui."{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.
.. e para sequencias e , e para listas. Entendi a distincao.{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}.pngimage_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
{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.
* tambem lida com multiplos arquivos de uma vez. Qual e a diferenca?* 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
$variavelem um intervalo, useseqoueval.
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.
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}.logTarefa 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