2012-03-15 7 views
12

В Zsh, когда я должен создать кучу файлов с Zsh, я обычно делаю что-то вроде:Как обнулить колодками числовые переменные в Zsh (? И, возможно, также колотить)

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

Это прекрасно работает , он дает мне файлы с именами foo-1.txt .. foo-1000.txt.
Однако эти файлы не сортируются красиво, поэтому я хотел бы изменить нулевую переменную $x, создав таким образом имена foo-0001.txt .. foo-1000.txt.

Как это сделать в zsh? (И бонус вопрос, как сделать это в баш?)

ответ

10

Используйте -w флаг seq (в любой оболочке):

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

О. Извините, не видел этого. – ervingsb

+0

seq -w 001 005 # pads – zzapper

9

Вы можете использовать Баш в brace expansion:

$ 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 

Works в zsh тоже.

2

Работает в Баш (не знаю, для Zsh):

echo foo{0000-1000}.txt 
15

Ради справки, если вы не имеете контроля над генерацией числовых значений, вы можете сделать отступы с:

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

Увидев, что $ {(l ... не очень дружелюбен к поисковой системе, посмотрите это под флажками расширения параметров в zshexpn (1)). Также парные разделители могут использоваться для того, чтобы сделать синтаксис a бит более интуитивно понятен: значение $ {(l {10} {0}) –

+0

Странно, zmv не понимает эту форму, хотя скобки отлично работают: значение $ {(l (10) (0))}. –

0
  1. 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 
    
  2. Используйте расширение скобки (только bash и zsh сохраняют ведущие нули ksh).

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