在zsh中,当我必须使用zsh创build一堆文件时,我通常会这样做:
for x in $(seq 1 1000); do .....; done
这工作正常,它给我的文件名称foo-1.txt
.. foo-1000.txt
。
但是,这些文件不能很好地sorting,所以我想零填充$x
variables,从而产生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
的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
使用大括号扩展(只有bash和zsh保持前导零ksh不)。
$ printf '%s\n' foo{1..004}.txt foo001.txt foo002.txt foo003.txt foo004.txt