mp3tag kid3 easytag linux bash zsh seq zero-pad

linux - easytag - kid3



¿Cómo poner a cero las variables numéricas en zsh(y tal vez también bash?) (5)

En zsh, cuando tengo que crear un montón de archivos con zsh, normalmente hago algo como:

for x in $(seq 1 1000); do .....; done

Esto funciona bien, me da archivos con nombres foo-1.txt .. foo-1000.txt .
Sin embargo, estos archivos no se ordenan bien, por lo que me gustaría rellenar con cero la variable $x , generando nombres de foo-0001.txt .. foo-1000.txt .

¿Cómo hacer eso en zsh? (y pregunta extra, ¿cómo hacerlo en bash?)


  1. printf
    Usar printf to pad con ceros funciona en cualquier 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. Use la expansión de llaves (solo bash y zsh mantienen los ceros iniciales ksh no).

    $ printf ''%s/n'' foo{1..004}.txt foo001.txt foo002.txt foo003.txt foo004.txt


Funciona en bash (no sé por zsh):

echo foo{0000-1000}.txt


Por motivos de referencia, si no tiene control sobre la generación de los valores numéricos, puede realizar el relleno con:

% value=314 % echo ${(l:10::0:)value} 0000000314 % echo $value 314


Puedes usar la expansión de refuerzo de bash:

$ 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 en zsh tambien.


Use la bandera -w para seq (en cualquier shell):

$ seq -w 1 10 01 02 03 04 05 06 07 08 09 10