Utilizando coringas no shell em particular o Brace Expansion ou Expansão com chaves

Frequentemente nos deparamos com situações em que é preciso trabalhar com multiplos arquivos, seja ela qual for: remover múltiplos arquivos, criar, procurar, mudar as permissões, entre outras. Qual seja a situação, o shell nos permite fazer isso com comodidade, utilizando os conhecidos coringas, alguns deles muitos conhecidos como o “*” e outros pouco conhecidos mas muito util como o {teste1,teste2,teste3,…} conhecido como “brace expansion” ou expansão com chaves. Vamos dar uma olhada em uma tabela, retirada do livro Certificação Linux LPI da editora Alta Books:

Coringa Descrição
* Em geral, pensa-se que este coringa “corresponde a qualquer coisa”; na verdade, ele corresponde a zero ou mais caracteres (o que inclui “nada”!). Por exemplo, x* corresponde aos arquivos ou diretórios x, xy, xyz, x.txt, xyz.c, e asim por diante.
? Corresponde a exatamente um caracter. Por exemplo, x? corresponde aos arquivos ou diretórios xx,xy, xz, mas não a x ou xyz. A especificação x?? corresponde a xyz, mas não a x ou xy.
[caracteres] Corresponde a qualquer um dos caracteres dentre os caracteres listados entre os colchetes. Por exemplo, x[yx] corresponde a xy e xz.
[!caracteres] Corresponde a qualquer um dos caracteres exceto os caracteres listados entre os colchetes. Por exemplo, x[yx] corresponde a xy e xz.
[a-z] Corresponde a qualquer caracter dentre a faixa de caracteres listada entre os colchetes e indicada pelo hífen (o caracter hífen não é incluído na correspondência). Por exemplo, x[0-9] corresponde a x0 e x1, mas não a xx. Repare que, para procurar tanto pelas letras maiúsculas quanto pelas minúsculas (os nomes de arquivos do Linux são sensíveis ao caso(Case Sensitive)), você especifica [a-zA-Z]. Usar [a-zA-Z] corresponde tanto a xa quanto a xA.
[!a-z] Corresponde a qualquer caracter dentre os que não se encontrem dentro da faixa listada entre colchetes.
{frag1,frag2,frag3,…} Cria strings frag1, frag2, frag3, etc. Por exemplo, file_{one,two,three} gera as strings file_one, file_two e file_three. Este é um operador especial chamado de expansão com chaves, o qual pode ser usado para corresponder a nomes de arquivos, mas que não é especificamente um operador coringa, e não examina os diretórios em busca de arquivos que correspondam à sua especificação. Em vez disso, ele expande qualquer string.
Por exemplo, pode ser usado com echo para gerar strings completamente não-relacionadas com nomes de arquivos existentes:
$echo string_{a,b,c}
string_a string_b string_c

Vamos ver algumas aplicações para os coringas:

Utilizando o coringa *:

Se você não lembra o nome do arquivo completo mas pelo menos de alguma parte, esse coringa vai ajudar

tiago@tiago-laptop:~/blog$ touch teste{1..3}
tiago@tiago-laptop:~/blog$ ls -l *est*
-rw-r–r– 1 tiago tiago 0 2009-02-06 17:31 teste1
-rw-r–r– 1 tiago tiago 0 2009-02-06 17:31 teste2
-rw-r–r– 1 tiago tiago 0 2009-02-06 17:31 teste3
tiago@tiago-laptop:~/blog$

utilizando o * você pode mover todos os arquivo com uma extensão especifica:

tiago@tiago-laptop:~/blog$ touch teste{1..3}.sh
tiago@tiago-laptop:~/blog$ mkdir pasta
tiago@tiago-laptop:~/blog$ mv *.sh pasta/
tiago@tiago-laptop:~/blog$ ls
pasta  teste1  teste2  teste3
tiago@tiago-laptop:~/blog$ ls pasta/
teste1.sh  teste2.sh  teste3.sh
tiago@tiago-laptop:~/blog$

Agora utilizando o “?” ele substituirá exatamente um unico caracter em uma palavra, utilizando dois “??” substituirá dois:

tiago@tiago-laptop:~/blog$ touch teste{11..13}.log
tiago@tiago-laptop:~/blog$ ls
pasta  teste1  teste11.log  teste12.log  teste13.log  teste2  teste3
tiago@tiago-laptop:~/blog$ ls -lah teste*.???
-rw-r–r– 1 tiago tiago 0 2009-02-06 17:40 teste11.log
-rw-r–r– 1 tiago tiago 0 2009-02-06 17:40 teste12.log
-rw-r–r– 1 tiago tiago 0 2009-02-06 17:40 teste13.log
tiago@tiago-laptop:~/blog$ ls -l pasta/teste*.??
-rw-r–r– 1 tiago tiago 0 2009-02-06 17:34 pasta/teste1.sh
-rw-r–r– 1 tiago tiago 0 2009-02-06 17:34 pasta/teste2.sh
-rw-r–r– 1 tiago tiago 0 2009-02-06 17:34 pasta/teste3.sh
tiago@tiago-laptop:~/blog$

Observando acima, onde ele busca por .??? ele retorna todos com a extensão .log e quando com .?? todos com extensão com apenas dois caracteres no caso .sh

abaixo utilizando o coringa [caracteres]

tiago@tiago-laptop:~/blog$ touch testa{1..3}
tiago@tiago-laptop:~/blog$ ls test[e]?
teste1  teste2  teste3
tiago@tiago-laptop:~/blog$ ls test[a]?
testa1  testa2  testa3
tiago@tiago-laptop:~/blog$ ls test[ea]?
testa1  testa2  testa3  teste1  teste2  teste3

para o coringa [!caracteres] ele negará os caracteres e mostrará todos os outros


para o coringa [a-z]

tiago@tiago-laptop:~/blog$ ls test[a-f][1-9]
teste1  teste2  teste3
tiago@tiago-laptop:~/blog$

a partir da palavra test + de “a” a “f” + de “1” a “9” o shell expandirá todos os valores possiveis:

testa1 testa2 testa3 testa4 testa5 testa6 testa7 testa8 testa9 testb1 testb2 testb3 testb4 testb5 testb6 testb7 testb8 testb9 testc1 testc2 testc3 testc4 testc5 testc6 testc7 testc8 testc9 testd1 testd2 testd3 testd4 testd5 testd6 testd7 testd8 testd9 teste1 teste2 teste3 teste4 teste5 teste6 teste7 teste8 teste9 testf1 testf2 testf3 testf4 testf5 testf6 testf7 testf8 testf9

dentre eles estão os três arquivos que listamos no diretório.

para o coringa [!a-z] ele negará todos os caracteres de a-z e mostrará todos os outros

Enfim falando sobre brace expansion:

Em todos os exemplos acima, foi utilizado o brace expansio para criar os arquivos:

tiago@tiago-laptop:~/blog$ touch testa{1..3}

alguns testes

tiago@tiago-laptop:~/blog$ echo test{e,ando,ado,ou,a}
teste testando testado testou testa

Pode ser utilizado tambem os dois pontos para se utilizar o intervalo {1..0}

tiago@tiago-laptop:~/blog$ echo teste{1..9}
teste1 teste2 teste3 teste4 teste5 teste6 teste7 teste8 teste9
tiago@tiago-laptop:~/blog$ echo {1..9}
1 2 3 4 5 6 7 8 9
tiago@tiago-laptop:~/blog$ echo {Z..a}
Z [  ] ^ _ ` a
tiago@tiago-laptop:~/blog$ echo {a..Z}
a ` _ ^ ]  [ Z
tiago@tiago-laptop:~/blog$ echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
tiago@tiago-laptop:~/blog$

Ta ok, é muito maneiro e bunito, mas pra que serve?

ok, se preciso criar varios diretorios, olha a moleza:

tiago@tiago-laptop:~/blog$ ls -l pasta/
total 16
drwxr-xr-x 2 tiago tiago 4096 2009-02-06 18:14 pasta1
drwxr-xr-x 2 tiago tiago 4096 2009-02-06 18:14 pasta2
drwxr-xr-x 2 tiago tiago 4096 2009-02-06 18:14 pasta3
drwxr-xr-x 2 tiago tiago 4096 2009-02-06 18:14 pasta4

Entre estes exemplos existem muitas outras formas de se usar o brace expansion que se torna muito útil no dia a dia, deixo aqui a minha ajuda.

Abs.

Dicas, Linux, Shell, Unix

Se você gostou do artigo, deixe um comentário ou inscreva-se no feed e receba os artigos em seu leitor de feed.

Um comentário para “Utilizando coringas no shell em particular o Brace Expansion ou Expansão com chaves”

  1. Fala mestre Tiago,
    Olha o exemplo para backup de preguiçoso

    valdinei@note-valdineidossantos.com:/tmp/test$ cp arquivoImportante.php{,-BKP}
    valdinei@note-valdineidossantos.com:/tmp/test$ ls
    arquivoImportante.php arquivoImportante.php-BKP

    Se fosse uma linha com tamanho gigantesco seria a mesma coisa.
    cp linhaGigantesca{,adicional}

    Simples né….

    Abraços.

Deixe um comentário

(required)

(required)