Liệt kê các tệp khớp với một mẫu nhưng bỏ qua các tệp khớp với mẫu khác?


12

Giả sử tôi có một thư mục chứa các tệp a1, a2, a3, b1, b2, b3. Tôi chỉ muốn khớp các tệp bắt đầu với anhưng không chứa 3. Tôi đã thử ls -I "*3" *a*nhưng nó trả về a1 a2 a3, mặc dù tôi không muốn nó khớp a3. Điều này có thể với ls?


bộ câu trả lời đa dạng thú vị ở đây, nhưng một lời giải thích tại sao ls -I '* 3' a * thất bại sẽ được chỉnh sửa. và / hoặc tại sao danh sách toàn cầu của shell không bị lọc bởi công tắc bỏ qua sang ls?
Theophrastus

Man page nói về các tùy chọn -I: do not list implied entries matching shell PATTERN, tuy nhiên nó không giải thích những gì có nghĩa là ngụ ý , nhưng tôi đoán nó chỉ áp dụng cho các tập tin lsđược bằng cách mở rộng glob - và lskhông mở rộng a*, vỏ nào đó .
Murray Jensen

Câu trả lời:


14

Chỉ:

shopt -s extglob  
ls a!(*3*)
  • shopt -s extglob kích hoạt Globing mở rộng.
  • a phù hợp với sự khởi đầu a
  • !()phủ nhận trận đấu bên trong ()...
    • *3*đó là 3và bất cứ điều gì trước hoặc sau nó.

$ touch 1 2 3 a1 a2 a3 b1 b2 b3 aa1 aa2 aa3 a2a a3a
$ ls a!(*3*)
a1  a2  a2a  aa1  aa2

1
FYI, yêu cầuset -s extglob
Brian

@Brian Yea, chỉ cần chú ý ^^
hỗn loạn

8

Các câu trả lời hiện có nêu rõ cách tốt nhất để làm điều này với các khối; Tôi sẽ bao gồm điều này bởi vì trong hầu hết các trường hợp, findlà một lựa chọn tốt hơn nếu bạn muốn thực hiện kịch bản hoặc xử lý thêm:

$ find . -maxdepth 1 -name 'a*' -not -name '*3*'
./a1
./a2

Bạn có thể cung cấp câu trả lời xargscho các hành động dễ dàng hoặc một while readvòng lặp cho những điều phức tạp hơn.


4

Một cách dễ dàng là

  • liệt kê tất cả các tệp phù hợp a*
  • sau đó xóa tất cả các dòng có chứa một 3

Lệnh UNIX là

ls -1 a* | grep -v 3

ls -1 hiển thị một tệp trên mỗi dòng.

grepthông thường tìm thấy các dòng khớp với một mẫu nhưng với -vhành vi này bị đảo ngược, tức là grep tìm thấy các dòng không khớp với mẫu đó.


2
Chào Peter! Tốt nhất là giải thích, càng chi tiết càng tốt, cách giải pháp của bạn hoạt động.
dhag

2
Phân tích cú pháp lskhông phải là một ý tưởng hay: mywiki.wooledge.org/ParsingLs
hỗn loạn

3

Với zsh, sử dụng ~ toán tử toàn cầu :

setopt extendedglob
print -rl -- a*~*3*

Với gnu lsbạn có thể sử dụng hai --ignoretùy chọn:

ls -I '[^a]*' -I '*3*'

cái thứ nhất bỏ qua tất cả các tên tệp không bắt đầu avà thứ 2 bỏ qua các tên tệp có chứa3

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.