如何在zsh中填充数字variables(也可能是bash?)

zsh中,当我必须使用zsh创build一堆文件时,我通常会这样做:

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

这工作正常,它给我的文件名称foo-1.txt .. foo-1000.txt
但是,这些文件不能很好地sorting,所以我想零填充$xvariables,从而产生foo-0001.txt .. foo-1000.txt

如何在zsh中做到这一点? (和奖金的问题,如何做bash?)

使用-w标志来seq (在任何shell中):

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

为了便于参考,如果您不能控制数值的生成,可以使用下面的填充操作:

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

你可以使用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 

也在zsh中工作。

在bash中工作(不知道zsh):

 echo foo{0000-1000}.txt 
  1. 的printf
    使用printf填充零可以在任何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. 使用大括号扩展(只有bash和zsh保持前导零ksh不)。

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