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
mkdirecppara 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.
file1.txt até 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, é perfeito para inspecionar o resultado de uma expansão.
$ echo file{1..5}.txtfile1.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
.. (dois pontos) significa "daqui até aqui."{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.
.. é para sequências e , é para listas. Entendi a distinção.{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}.pngimage_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
{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.
* também lida com múltiplos arquivos de uma vez. Qual é a diferença?* 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
$variavelem um intervalo, useseqoueval.
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.
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}.logTarefa 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