[2-57]
là một bộ ký tự bao gồm 2
, 3
, 4
, 5
và 7
, trong zsh và mỗi ký tự đại diện khác và cú pháp regexp ra khỏi đó. Mẫu hình cầu của bạn *[2-57]
khớp với mọi tên tệp có ký tự cuối cùng là một trong năm chữ số đó.
Tôi nghĩ rằng bạn đang đánh giá sai cú pháp của [m,n]
vòng loại toàn cầu . Vòng loại Glob luôn đi trong ngoặc đơn ở cuối mẫu và dấu phân cách phạm vi là dấu phẩy. Mô hình *([2,57])
mở rộng đến các trận đấu thứ 2, 3, tầm, 57. Thứ tự mở rộng mặc định là từ điển (với một số phép thuật đặc biệt để sắp xếp các số theo thứ tự số nếu numeric_glob_sort
tùy chọn được đặt); bạn có thể kiểm soát nó bằng o
hoặc O
vòng loại toàn cầu (ví dụ: *(om[2,57])
để khớp với 57 tệp gần đây nhất ngoại trừ một tệp gần đây nhất).
for x in /foo/bar/*([2,57]); do print $x; done
Không phải những gì bạn yêu cầu, nhưng có liên quan và có thể hữu ích cho những người đọc trong tương lai: nếu bạn muốn liệt kê các tệp từ 2 đến 57 cho dù chúng có tồn tại hay không, bạn có thể sử dụng biểu thức dấu ngoặc kép . Tính năng này cũng tồn tại trong bash và ksh.
echo hello{2..57}
Và nếu bạn muốn khớp các tệp có tên chứa một số từ 2 đến 57, bạn có thể sử dụng mẫu <2-57>
. Điều này là cụ thể cho zsh.
$ ls
file1 file2 file3 file57 file58
$ echo file<2-57>
file2 file3 file57
Lưu ý rằng một mẫu như *<2-57>
có khả năng không làm những gì bạn mong đợi, bởi vì các mẫu *
cũng có thể khớp với các chữ số. Ví dụ, file58
phù hợp *<2-57>
với file5
phù hợp với các *
bộ phận và 8
phù hợp với các <2-57>
bộ phận. Các mô hình *[^0-9]<2-57>
tránh vấn đề này.