Uso das chaves na linha de comando

Publicado por Elgio Schlemer em 25/10/2007

[ Hits: 16.145 ]

Blog: https://profelgio.duckdns.org/~elgio

 


Uso das chaves na linha de comando



Um parâmetro pouco empregado e quase desconhecido em bash é o uso das chaves em um comando.

Melhor mesmo é um exemplo:

$ ls -la
total 8
drwxr-xr-x 2 elgio elgio 4096 2007-10-04 21:50 .
drwxr-xr-x 80 elgio elgio 4096 2007-10-04 21:47 ..

$ mkdir Arquivo{01,02,03,04,05,06,07,08,09,10}-teste

$ ls -la
total 18
drwxr-xr-x 12 elgio elgio 4096 2007-10-04 21:50 .
drwxr-xr-x 80 elgio elgio 4096 2007-10-04 21:47 ..
drwxr-xr-x 2 elgio elgio 4096 2007-10-04 21:50 Arquivo01-teste
drwxr-xr-x 2 elgio elgio 4096 2007-10-04 21:50 Arquivo02-teste
drwxr-xr-x 2 elgio elgio 4096 2007-10-04 21:50 Arquivo03-teste
drwxr-xr-x 2 elgio elgio 4096 2007-10-04 21:50 Arquivo04-teste
drwxr-xr-x 2 elgio elgio 4096 2007-10-04 21:50 Arquivo05-teste
drwxr-xr-x 2 elgio elgio 4096 2007-10-04 21:50 Arquivo06-teste
drwxr-xr-x 2 elgio elgio 4096 2007-10-04 21:50 Arquivo07-teste
drwxr-xr-x 2 elgio elgio 4096 2007-10-04 21:50 Arquivo08-teste
drwxr-xr-x 2 elgio elgio 4096 2007-10-04 21:50 Arquivo09-teste
drwxr-xr-x 2 elgio elgio 4096 2007-10-04 21:50 Arquivo10-teste

É como se eu tivesse digitado:

mkdir Arquivo01-teste Arquivo02-teste ...

Quem não conhece, certamente iria fazer isto com um for:

$ for i in 01 02 03 04 05 06 07 08 09 10
do
mkdir Arquivo$i-teste
done


Mas pra que?

Veja outro exemplo:

$ echo teste{0,1,2,3,4,5,6,LIXO}
teste0 teste1 teste2 teste3 teste4 teste5 teste6 testeLIXO

Outras dicas deste autor

Enviar aspas em PHP de maneira menos suja

Inserir comentários em regras do iptables

Cálculo da potência modular de forma eficiente

DROP ou REJECT no iptables?

Extrair a data de uma fotografia

Leitura recomendada

Vídeo do LinuxTips - Gerenciamento de Pacotes

LXDE - Preferências da Área de Trabalho

Alias para atualizar apt e flatpak

CAT - Descobrindo informações sobre sua distribuição

Removendo linhas duplicadas não-consecutivas

  

Comentários
[1] Comentário enviado por edirlf em 25/10/2007 - 19:32h

Amigo, há alguma maneira de fazer este mesmo comando

mkdir Arquivo{01,02,03,04,05,06,07,08,09,10}-teste

dessa maneira?

mkdir Arquivo{`seq -s ',' 30`}-teste

Tentei adaptar ele pra fazer isso, porém ele cria um único arquivo com todos os números concatenados. Tem jeito isso?

Grande abraço e parabéns pela dica.

[2] Comentário enviado por elgio em 25/10/2007 - 20:45h

Não dá.
Os {} são avaliados pelo shell antes do subcomando.

Mas assim funciona:

mkdir Arquivo{0{1..9},10}-teste

E no segundo caso:
mkdir Arquivo{1..30}-teste

[3] Comentário enviado por removido em 25/10/2007 - 21:12h

Boa garoto... anotado!

[4] Comentário enviado por tenchi em 26/10/2007 - 09:59h

Legal mesmo é criar diretórios "recursivamente":
$ mkdir -p tmp/{usr/{bin,share,doc,lib/pkgconfig},etc/{X11,init.d},var/{log,www/htmldocs/}}

O problema é que é muito fácil se perder entre tantos abre e fecha chaves...

PS: Porque eu sempre confundo chaves com colchetes? hauahua

[5] Comentário enviado por lipse em 29/10/2007 - 09:08h

Estou no trabalho e não posso fazer uns testes agora (máquinas win) mas, queria algo pra se utilizar com o "mv" na tarefa de renomear arquivos. Algo como:

$ mv Arquivo.Teste.{0{1..9},{10..20}}* arquivo_teste_{0{1..9},{10..20}}.ext

Alguém sabe se isso aí funcionaria?

[6] Comentário enviado por elgio em 29/10/2007 - 09:33h

Nem pensar!
O mv não funciona assim.

É sempre mv UmArquivo OutroArquivo

OU mv VariosArquivos Diretorio

NUNCA mv VariosArquivos OutroVariosArquivos

Para renomear vários assim somente com um laço usando for ou while

[7] Comentário enviado por lipse em 29/10/2007 - 11:56h

Valeu Elgio!

Eu imaginei que ele não aceitaria, só não tinha certeza... iria facilitar tanto...

Hehheheheh

Bom, continuo nos laços mesmo.

Abraço.

[8] Comentário enviado por edirlf em 29/10/2007 - 13:50h

Só por curiosidade mesmo, mas, alguém sabe o limite máximo de diretórios que posso criar com uma única linha no mkdir? Ou seja, o tamanho máximo da lista de argumentos.

Assim: mkdir diretorio01 diretorio02

até o diretório n?

Abraços.

[9] Comentário enviado por edirlf em 30/10/2007 - 13:45h

Muito legal essa de criar diretórios recursivamente Tenchi. Anotado também! :D
Falows, abraço.

[10] Comentário enviado por gabrielsp em 09/11/2007 - 21:19h

favoritadaço!! =D

[11] Comentário enviado por gabrielsp em 26/05/2008 - 08:13h

opa, alguem sabe se da pra renomear uma pasta em comum em varios pcs com nomes sequenciais com uso de chaves? por ex: mv micro{1..10}/home/usuario/teste /home/usuario/teste2

Abs

[12] Comentário enviado por elgio em 26/05/2008 - 10:03h

Isto já foi respondido 5 comentários acima, em 29/10/2007 - 09:33h.

O mv só suporta DOIS parâmetros ou vários se apenas o último for uma pasta e todos os anteriores forem arquivos.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts