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
[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
kaizers2li em 09/11/2007 - 21:19h:
favoritadaço!! =D
[11] Comentário enviado por
kaizers2li 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.