在zsh中,当我必须用zsh创建一堆文件时,我通常会做类似的事情:

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

这工作正常,它给了我名字的文件 foo-1.txt .. foo-1000.txt.
但是,这些文件没有很好的排序,所以我想零填充 $x 变量,从而产生的名称 foo-0001.txt .. foo-1000.txt.

如何在zsh中做到这一点?(还有一个问题,如何在bash中做到这一点?)

有帮助吗?

解决方案

使用 -w 旗帜至 seq (在任何外壳中):

$ 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
    
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top