2012-03-15 29 views
12

Trong zsh, khi tôi có để tạo ra một loạt các file với zsh, tôi thường làm một cái gì đó như:Làm thế nào để zero-pad biến số trong zsh (? Và có lẽ cũng bash)

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

này hoạt động tốt , nó cung cấp cho tôi các tệp có tên foo-1.txt .. foo-1000.txt.
Tuy nhiên, các tệp này không sắp xếp độc đáo, vì vậy tôi muốn không có biến số $x, do đó, tạo tên của foo-0001.txt .. foo-1000.txt.

Cách thực hiện điều đó trong zsh? (Và tiền thưởng câu hỏi, làm thế nào để làm điều đó trong bash?)

Trả lời

10

Sử dụng -w cờ để seq (trong bất kỳ vỏ):

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

Oh. Xin lỗi, không thấy điều đó. – ervingsb

+0

seq -w 001 005 # miếng – zzapper

9

Bạn có thể sử dụng bash của 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 

trình trong zsh quá.

2

trình trong bash (không biết cho zsh):

echo foo{0000-1000}.txt 
15

Vì tham khảo, nếu bạn không có quyền kiểm soát việc tạo ra các giá trị số, bạn có thể làm đệm với:

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

Thấy rằng $ {(l ... không phải là rất thân thiện với công cụ tìm kiếm, hãy tìm kiếm điều này dưới Thư mục mở rộng tham số trong zshexpn (1). trực quan hơn một chút: giá trị $ {(l {10} {0})} –

+0

Kỳ lạ, zmv không hiểu biểu mẫu đó, mặc dù dấu ngoặc đơn hoạt động tốt: $ {(l (10) (0)) value}. –

0
  1. printf
    Sử dụng printf để pad với số không làm việc trong bất kỳ 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. Sử dụng mở rộng cú đúp (chỉ bash và zsh giữ số không ở đầu ksh không).

    $ printf '%s\n' foo{1..004}.txt 
    foo001.txt 
    foo002.txt 
    foo003.txt 
    foo004.txt 
    
Các vấn đề liên quan