Uso das chaves na linha de comando

Publicado por Elgio Schlemer em 25/10/2007

[ Hits: 15.817 ]

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

Inserir comentários em regras do iptables

Usando rm para apagar arquivos esquisitos

Firewall SIMPLES e eficiente para DESKTOP em 5 linhas

Melhore o desempenho do HISTORY

DROP ou REJECT no iptables?

Leitura recomendada

Sabayon e Gentoo - Atualizar Portage em um único comando

rm - remover vários arquivos excetuando alguns

Consultando qual o repositório está ativo no slackpkg usando apenas o grep

Comando find: expressões regulares e exclusão de diretórios

Comprometendo a integridade de um arquivo

  

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