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?)

Foi útil?

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 
  1. 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
    
  2. 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
    
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top