28

在 zsh 中,当我必须使用 zsh 创建一堆文件时,我通常会执行以下操作:

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

这很好用,它给了我带有名字的文件foo-1.txt...... 但是,这些文件不能很好地排序,所以我想对变量进行零填充,从而产生..的名称。foo-1000.txt
$xfoo-0001.txtfoo-1000.txt

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

4

6 回答 6

32

作为参考,如果您无法控制数值的生成,则可以使用以下方法进行填充:

% value=314
% echo ${(l:10::0:)value}
0000000314
% echo $value
314
于 2013-04-15T14:26:47.823 回答
17

使用该-w标志seq(在任何外壳中):

$ seq -w 1 10
01
02
03
04
05
06
07
08
09
10
于 2012-03-15T08:22:51.357 回答
11

您可以使用 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 中使用。

于 2012-03-15T11:16:47.340 回答
4

在 Zsh 中:

% my_num=43
% echo ${(l(5)(0))my_num}
00043
于 2020-02-10T18:19:57.577 回答
1

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

echo foo{0000-1000}.txt 
于 2012-03-15T11:17:03.140 回答
1
  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
    
于 2017-06-09T07:35:21.170 回答