Tôi có một số tệp có cùng tên tệp cơ sở. Tôi muốn xóa tất cả trừ một
foo.org #keep
foo.tex #delete
foo.fls #delete
foo.bib #delete
etc
Nếu tôi không cần giữ một cái, tôi biết tôi có thể sử dụng rm foo.*
.
TLDP thể hiện ^
để phủ nhận một trận đấu. Thông qua thử nghiệm và lỗi, tôi đã có thể tìm thấy rằng
rm foo.*[^org]
làm những gì tôi cần, nhưng tôi không thực sự hiểu cú pháp.
Ngoài ra, mặc dù không phải là một giới hạn trong trường hợp sử dụng của tôi, tôi nghĩ rằng mô hình này cũng bỏ qua foo.o
và foo.or
. Làm thế nào để mô hình này hoạt động, và một quả cầu mà bỏ qua chỉ foo.org
trông như thế nào?
Regular Expression
. Bạn nên cẩn thận với các nhân vật nhóm của bạn. Bằng cách sử dụng dấu ngoặc bạn đã chỉ định một ý nghĩa lớp nhân vật mà bạn sẽ xóa bất kỳ tập tin đó có một phần mở rộng với các chữ cái o
, r
hoặc g
trong bất kỳ thứ tự. Sử dụng dấu ngoặc đơn để tạo một nhóm và giữ nguyên thứ tự các ký tự.
foo.*[^org]
sẽ khớp với bất kỳ tên tệp nào bắt đầu bằng foo.
một hoặc nhiều ký tự sau dấu chấm trong đó ký tự cuối cùng không phải là o, r hoặc g. Vì vậy, nó sẽ phù hợp foo.orb
, nhưng không foo.org
hay foo.or
hay foo.o
. Câu trả lời của GlennJackman cho thấy cách bật các tính năng khớp mẫu mở rộng để phủ định kết quả khớp.
rm foo.*[^org]
loại bỏ tất cả các tệp mà ký tự cuối cùng không phảio
,r
hoặcg
, do đó,foo.foo
cũng không khớp.