Come azzerare le variabili numeriche in zsh (e forse anche bash?)
Domanda
In zsh, quando devo creare un mucchio di file con zsh, di solito faccio qualcosa del tipo:
for x in $(seq 1 1000); do .....; done
Funziona bene, mi dà file con nomi foo-1.txt
.. foo-1000.txt
.
Tuttavia, questi file non vengono ordinati correttamente, quindi vorrei azzerare il file $x
variabile, producendo così nomi di foo-0001.txt
.. foo-1000.txt
.
Come farlo in zsh?(e domanda bonus, come farlo in bash?)
Soluzione
Utilizzare il bandiera -w
in seq
(in qualsiasi shell):
$ seq -w 1 10
01
02
03
04
05
06
07
08
09
10
. Altri suggerimenti
Per motivi di riferimento, se non si dispone del controllo sulla generazione dei valori numerici, è possibile eseguire il riempimento con:
% value=314
% echo ${(l:10::0:)value}
0000000314
% echo $value
314
. È possibile utilizzare Bash espansione del braccio : .
$ 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
.
funziona anche a zsh.
Lavora in bash (non so per zsh):
echo foo{0000-1000}.txt
. printf
Usare printf per riempire con zeri funziona in qualsiasi 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
Usa l'espansione delle parentesi graffe (solo bash e zsh mantengono gli zeri iniziali, ksh no).
$ printf '%s\n' foo{1..004}.txt foo001.txt foo002.txt foo003.txt foo004.txt