¿Cómo rellenar con ceros variables numéricas en zsh (y tal vez también en bash?)
Pregunta
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 ceros el $x
variable, produciendo así nombres de foo-0001.txt
.. foo-1000.txt
.
¿Cómo hacer eso en zsh?(y una pregunta adicional, ¿cómo hacerlo en bash?)
Solución
Utilizar el -w
bandera a seq
(en cualquier shell):
$ seq -w 1 10
01
02
03
04
05
06
07
08
09
10
Otros consejos
Para el bien de referencia, si no tiene control sobre la generación de los valores numéricos, puede hacer relleno con:
% value=314
% echo ${(l:10::0:)value}
0000000314
% echo $value
314
Puede usar Bash's expansión de braces :
$ 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 también.
trabaja en bash (no se sabe para zsh):
echo foo{0000-1000}.txt
-
printf
Uso de PrintF para almohadillar 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
-
Use la expansión de la abrazadera (solo Bash y Zsh Mantenga a los principales ceros KSH no).
$ printf '%s\n' foo{1..004}.txt foo001.txt foo002.txt foo003.txt foo004.txt