Liệt kê phạm vi tệp với các ký tự UNIX


14

Ví dụ: tôi có các tệp sau trong thư mục làm việc của mình: mjk0001.uits, mjk0002.uits, ... tăng số lượng tất cả các cách để mjk9999.uits.

Có cách nào để sử dụng các ký tự đại diện UNIX để liệt kê hoặc hoạt động trên một nhóm liên tiếp của chúng không? Ví dụ: nếu tôi cần chạy một quy trình từ 0025 đến 0050, tôi sẽ sử dụng định dạng nào?

Tôi đã thử những điều sau đây nhưng không thành công:

ls *[25-50].fits
ls mjk00[25-50].fits
ls mjk[0025-0050]*
ls *[0025-0050]*

Cảm ơn mọi người trước, MK


Để tham khảo: khớp mẫu , globalbing
ignis

Câu trả lời:


20

Bạn có thể sử dụng mở rộng nẹp:

ls mjk00{25..50}.fits

Số không hàng đầu có thể được bao gồm nếu cần thiết:

ls mjk0{000..149}.fits

1
Sử dụng cú pháp này, bạn cũng có thể chỉ định một giá trị bước : {25..50..2}.
tộc

1

Không trực tiếp, nhưng bạn có thể sử dụng nhiều mẫu hình cầu:

ls mjk002[56789].fits mjk00[34]?.fits

Đó không phải là chính xác những gì bạn đang tìm kiếm, nhưng đó là điều gần nhất mà các mẫu toàn cầu cung cấp, và nó chắc chắn tốt hơn so với việc gõ từng hệ thống tệp. Ít nhất số lượng mẫu bạn sẽ cần cho mỗi phạm vi số được giới hạn bởi nhật ký của các điểm cuối số của phạm vi.


1

Bạn có thể sử dụng regex với grep. Tôi không phải là một bậc thầy regex. Sau đây trả về mẫu với các số betweeen 25-50:

ls | sort -n | grep -E 'mjk00([2][5-9]|[3-4][0-9]|[5][0]).fits'

Tôi không biết nếu có thể và làm thế nào cuối cùng khái quát hóa điều này với grep.


0

Có thể đạt được tính di động hoặc tính linh hoạt cao hơn bằng cách sử dụng forvòng lặp và printf:

for i in $(seq 25 50 1) ; do ls --escape $(printf "mjk%04d*" $i) ||true; done

Điều này xử lý không gian tốt và kết quả rất phù hợp cho đường ống để xargsxử lý tiếp.

Các số có nhiều kết quả trùng khớp sẽ dẫn đến tất cả các tệp phù hợp được liệt kê.

Các số không khớp sẽ báo lỗi trên stderr, nhưng việc ||truechặn trả về lỗi cấp bash.


Tuy nhiên, trong trường hợp cơ bản, sử dụng forprintfkhông khác gì ngắn gọn hơn:

ls --escape mjk{0025..0050..1}* ||true

Nếu bạn muốn tách kết quả mở rộng for i in {025..050} ; do ... ; done
niềng răng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.