Cách tìm tất cả các tệp ngoại trừ một tệp đã chỉ định


13

lsthể cho một kết quả như

[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ls

CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo

Nhưng thực sự tôi hy vọng chỉ cần tìm ra CentOS-Base.repoCentOS-Debuginfo.repoCentOS-Vault.repokhông CentOS-Media.repo. Vì vậy, tôi chạy lệnh này

ls [^\(Media\)]

Nhưng tôi nhận được một thông tin lỗi. Tôi nên làm thế nào?



@steel ấn Cảm ơn liên kết của bạn, điều đó rất hữu ích đối với tôi ..
yode

Bạn có thể cân nhắc chuyển vỏ của mình sang zsh , nơi có thiết bị loại bỏ mô hình
Basile Starynkevitch

Câu trả lời:


10

Trong hầu hết các trường hợp đơn giản, bạn có thể sử dụng như sau (trong trường hợp nếu từ phụ thứ 1 là tĩnh CentOS):

ls CentOS-[BDV]*

  • [BDV] - lớp ký tự để đảm bảo từ phụ thứ hai bắt đầu bằng một trong các ký tự được chỉ định

hoặc tương tự với phủ định :

ls CentOS-[^M]*

Nếu bạn muốn bỏ qua tất cả tên tệp có chứa Mký tự, với triển khai GNU ls(như thường thấy trên CentOS), hãy sử dụng tùy chọn -I( --ignore):

ls -I '*M*'

-I, --ignore = PATTERN
không liệt kê các mục ngụ ý khớp với vỏ MẪU

Để bỏ qua các mục có Mediatừ:

ls -I '*Media*'

Những mô hình đó cần phải được chuyển qua nguyên văn ls, do đó phải được trích dẫn (nếu không, vỏ sẽ coi chúng như những khối u để mở rộng).


Tại sao chúng ta không thể sử dụng ls *[^M]*
yode

Công ls CentOS-[^M]*việc, nhưng ls *[^M]*không ..
yode

@yode, phụ thuộc vào chính xác những gì bạn muốn bỏ qua: Msự xuất hiện của ký tự HOẶC Mediatừ?
RomanPerekhrest

Nhưng trong trường hợp của tôi, chỉ có tập tin đó có một charater M.
yode

3
Các mẫu rất tham lam: * đầu tiên khớp với tất cả mọi thứ trừ chữ cái cuối cùng, [^ M] khớp với chữ cái cuối cùng vì không có chữ nào kết thúc bằng M và dấu * khớp với chuỗi trống. Vì vậy, tất cả chúng phù hợp. Và ngay cả khi một cái gì đó kết thúc bằng M, nó vẫn khớp, giả sử có một cái gì đó khác với M ở đâu đó: ví dụ: nếu bạn có một tệp có tên OOM, ngôi sao đầu tiên sẽ khớp với O đầu tiên, [^ M] sẽ khớp với O thứ hai và bắt đầu kéo dài sẽ phù hợp với M.
NickD

12

Một số shell có toán tử phủ định phủ định:

  • zsh -o extendedglob:

    ls -d -- ^*Media*
    ls -d -- *.repo~*Media* # ~ is "except" operator
    
  • ksh, zsh -o kshglob, bash -O extglob:

    ls -d -- !(*Media*)
    
  • bash:

    GLOBIGNORE='*Media*'
    ls -d -- *
    
  • ksh:

    FIGNORE='@(*Media|.)*'
    ls -d -- *
    

6

Một lựa chọn là sử dụng find với các -not -name cờ. Tức find . -not -name CentOS-Media.repo. Nếu bạn không muốn lặp lại cấu trúc thư mục, hãy thêm -maxdepth 1cờ.

Ngoài ra, người ta có thể viết những điều sau đây (phức tạp hơn nhiều, nhưng tôi quên mất -not cờ và đăng câu trả lời này ban đầu, vì vậy tôi sẽ không xóa phần này):

find . -print0 | grep --invert-match -z "CentOS-Media.repo$" | tr '\0' '\n'

Bạn cần buộc findtách các tên tệp bằng byte rỗng, để các dòng mới trong tên tệp sẽ không bị hỏng. Hy vọng, grephỗ trợ loại phân cách này với cờ -z. Bạn có thể muốn trở lại phân tách điển hình (ví dụ: null byte -> dòng mới) vớitr '\0' '\n'


1
Bạn cũng có thể nhận được tên tệp được phân tách bằng null printf '%s\0' *mà không lặp lại và không bao gồm các dấu chấm theo mặc định (nhưng một số shell có tùy chọn cho điều đó). Bạn cũng không cần -Echo rằng regexp, nhưng phải kén chọn bạn có nên xuyệc ngược sự .hoặc đặt nó trong [], và bạn làm phụ thuộc vào GNU tìm và grep.
dave_thndry_085

4

Cách dễ nhất là sử dụng find. Làm:

find . -maxdepth 1 -type f ! -name "CentOS-Media.repo"

Ở đây "f" có nghĩa là chỉ tìm kiếm các tệp thông thường (không bao gồm các liên kết tượng trưng cho các tệp thông thường; với GNUfind , sử dụng -xtype fthay thế để bao gồm chúng). Nếu bạn muốn tìm kiếm các thư mục, thay vào đó hãy chuyển "d".

( -maxdepthmặc dù ban đầu, một phần mở rộng GNU hiện khá phổ biến. Nếu bạn findkhông hỗ trợ nó, bạn có thể thay thế-maxdepth 1 bằng tiêu chuẩn ! -name . -prune).

xem trang tìm người để biết thêm các tính năng tuyệt vời

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.