Comment mettre à zéro les variables numériques dans zsh (et peut-être aussi bash ?)
Question
Dans zsh, lorsque je dois créer un tas de fichiers avec zsh, je fais généralement quelque chose comme :
for x in $(seq 1 1000); do .....; done
Cela fonctionne bien, cela me donne des fichiers avec des noms foo-1.txt
.. foo-1000.txt
.
Cependant, ces fichiers ne sont pas triés correctement, je voudrais donc mettre à zéro le $x
variable, produisant ainsi des noms de foo-0001.txt
.. foo-1000.txt
.
Comment faire ça dans zsh ?(et question bonus, comment faire ça en bash ?)
La solution
Utilisez le -w
drapeau à seq
(dans n'importe quel shell):
$ seq -w 1 10
01
02
03
04
05
06
07
08
09
10
Autres conseils
À titre de référence, si vous n'avez pas de contrôle sur la génération des valeurs numériques, vous pouvez effectuer un remplissage avec :
% value=314
% echo ${(l:10::0:)value}
0000000314
% echo $value
314
Vous pouvez utiliser les bash extension du corset:
$ 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
Fonctionne aussi dans zsh.
Fonctionne en bash (je ne sais pas pour zsh) :
echo foo{0000-1000}.txt
imprimer
Utiliser printf pour compléter avec des zéros fonctionne dans n'importe quel 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
Utilisez l'expansion des accolades (seuls bash et zsh conservent les zéros non significatifs, ksh ne le fait pas).
$ printf '%s\n' foo{1..004}.txt foo001.txt foo002.txt foo003.txt foo004.txt