Suponha que eu tenha um monte de arquivos nomeados desta maneira:
file01.txt file02.txt file03.txt ... file20.txt
e quero executar um comando em um intervalo desses arquivos.
Eu sei se quero 'rm' de 'file05.txt' para 'file09.txt' eu posso fazer:
rm file0[5-9].txt
mas como posso 'rm' um intervalo de file08.txt a file13.txt? Eu tentei esse código
rm file[08-13].txt
e isso não funciona. Eu poderia executar este comando:
rm file0[89].txt file1[0-3].txt
mas gostaria de saber se posso fazer isso com apenas mais um argumento refinado para 'rm' se for possível.
Respostas:
Você precisa usar a expansão de chave de
bash
:Isso removerá os arquivos
file08
parafile13
, mostrará uma mensagem de erro se algum arquivo estiver faltando.Defina o intervalo para atender às suas necessidades.
O problema com o operador de globbing
[]
é que ele trata cada caractere / dígito dentro dele como um único token e, portanto, suporta apenas declarações de intervalo usando dígitos únicos.Se você insistir em usar
[]
, poderá usar este padrão bastante feio para corresponderfile08
afile13
:fonte
mv foo.{txt,md}
oucp foo.txt{,.bak}
Alguns shells, como o padrão do Ubuntu
/bin/sh
(que édash
) oumksh
não possuem expansão de chave, ou, no caso deksh
- expansão de chave, não podem usar zeros acolchoados:Nesses casos, pode-se fazer uso de
printf
formatar a parte do número do nome do arquivo, e usar um loop while para implementar c-like para o comportamento loop (nota para substituirecho
comrm
ou o que quiser):E isso é bastante portátil - trabalha com
dash
,ksh
,mksh
, tambémbash
. No caso deksh
ebash
também podemos usarc-style for loop syntax (but not in case of
mkshor
dash`):Observe que, no
bash
caso,printf
suporta impressão em variável e, portanto, poderíamos fazer isso emprintf -v num "%.2d" "$i"
vez de usar a substituição de comando.fonte