Ответ 1
Используйте флаг -w
для seq
(в любой оболочке):
$ seq -w 1 10
01
02
03
04
05
06
07
08
09
10
В 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
Printf
Использование printf для прокрутки с нулями работает в любой оболочке:
$ 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