Sử dụng các mẫu OR trong ký tự đại diện


52

Nội dung thư mục của tôi là

$ ls -lrt
total 0
-rw-r--r-- 1 user1 admin 19 Oct  8 12:31 night.txt
-rw-r--r-- 1 user1 admin 19 Oct  8 12:31 noon.txt
-rw-r--r-- 1 user1 admin 38 Oct  8 12:31 day.txt

Tôi muốn liệt kê chi tiết các tập tin có một từ trong tên tệp như được chỉ định.

Thí dụ :

$ ls -lrt *day|night*
ls: *day: No such file or directory
bash: night.txt: command not found

Sản lượng dự kiến

-rw-r--r-- 1 user1 admin 19 Oct  8 12:31 night.txt
-rw-r--r-- 1 user1 admin 38 Oct  8 12:31 day.txt

Cách liệt kê các tệp khác nhau khớp với 2 parttern khác nhau hoặc nói ngắn gọn cách sử dụng regex với ls, để tôi có thể ORcác phần tên tệp.

Bản gốc, có nhiều tập tin trong thư mục, đã rút ngắn trường hợp để hỏi.

Câu trả lời:


65

Bạn thậm chí không cần kích hoạt tính năng mở rộng để làm những gì bạn muốn. Điều này sẽ làm việc trong bash:

ls {day*,night*}

7
Không, nó không có: touch day.txt; touch night.txt; ls {*day,night*}kết quả trongls: *day: No such file or directory
Matteo

1
Tôi đã điều chỉnh văn bản của người gửi bài gốc; Tôi nghĩ rằng đó là rõ ràng. thở dài . Văn bản cập nhật. Chắc chắn bạn có thể thấy rằng cơ chế hoạt động?
itbruce

7
Hoặc có thể *{day,night}*là gần hơn với những gì OP muốn.
derobert

25

Không có tùy chọn lsđể lọc tên tệp nhưng trong hầu hết các shell đều có phần mở rộng toàn cầuman bash /Pattern Matching

ksh

ls -lrtd -- *@(day|night)*

zsh

setopt extendedglob
ls -lrtd -- *(day|night)*

hoặc là:

setopt kshglob
ls -lrtd -- *@(day|night)*

bash

shopt -s extglob
ls -lrtd -- *@(day|night)*

Trong bất kỳ một trong ba shell này, bạn có thể làm điều này, nhưng lưu ý rằng nếu một trong các trường hợp không khớp với bất kỳ tệp nào, mẫu đó sẽ không được mở rộng (ví dụ: *day* night1.txt othernight.txtnếu không có tên tệp nào chứa day; xem man bash /EXPANSIONhoặc /Brace Expansioncụ thể):

ls -lrtd -- *{day,night}*

Trong bất kỳ shell nào bạn có thể làm:

ls -lrtd -- *day* *night*

Trong zsh, nếu không có dayhoặc nighttệp, hai lệnh cuối sẽ thất bại; thiết lập nonomatchhoặc csh_null_globtùy chọn, hoặc thêm (N)sau mỗi mô hình để tránh điều này.


1
Những gì về *{day,night}*. Tôi sẽ chỉnh sửa nó, nhưng tôi không biết shell nào hỗ trợ nó?
Random832

@ Random832 Hoạt động trong bash, kshzsh(không cần mở rộng toàn cầu), nhưng không sh- tuy nhiên, ví dụ "tất cả vỏ" cuối cùng của Nahuel không hoạt động sh.
Izkata

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.