Como zero-teclado numérico variáveis em zsh (e talvez também o bash?)
Pergunta
No zsh, quando eu tenho que criar um monte de arquivos com zsh, eu costumo fazer algo como:
for x in $(seq 1 1000); do .....; done
Isso funciona bem, dá-me de arquivos com nomes foo-1.txt
.. foo-1000.txt
.
No entanto, esses arquivos não classificar bem, então, eu gostaria de zero-pad o $x
variável, produzindo nomes de foo-0001.txt
.. foo-1000.txt
.
Como fazer isso em zsh?(e a pergunta de bônus, como fazê-lo em bash?)
Solução
Use o -w
bandeira seq
(em qualquer shell):
$ seq -w 1 10
01
02
03
04
05
06
07
08
09
10
Outras dicas
Para referência bem, se você não tem controle sobre a geração de valores numéricos, você pode fazer o preenchimento com:
% value=314
% echo ${(l:10::0:)value}
0000000314
% echo $value
314
Você pode usar do bash cinta de expansão:
$ for n in file-{0001..1000}.txt; do echo $n; done
file-0001.txt
file-0002.txt
file-0003.txt
file-0004.txt
file-0005.txt
file-0006.txt
file-0007.txt
file-0008.txt
file-0009.txt
file-0010.txt
...
file-0998.txt
file-0999.txt
file-1000.txt
Funciona em zsh também.
Funciona em bash (não sei para zsh):
echo foo{0000-1000}.txt
printf
Usando o printf para preencher com zeros funciona em qualquer shell:$ printf 'foo%03d.txt\n' $(seq 4) foo001.txt foo002.txt foo003.txt foo004.txt $ printf 'foo%03d.txt\n' {1..4} # works in bash, ksh, zsh. $ n=4; printf 'foo%03d.txt\n' {1..$n} # only ksh, zsh $ n=4; eval printf '"foo%03d.txt\n" {1..'"$n"'}' # workaround needed for bash
Usar cinta de expansão (apenas bash e zsh manter os zeros à esquerda ksh não).
$ printf '%s\n' foo{1..004}.txt foo001.txt foo002.txt foo003.txt foo004.txt