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