Câu trả lời được chấp nhận là tốt nếu bạn có thể sử dụng nhìn. Tuy nhiên, cũng có một cách tiếp cận khác để giải quyết vấn đề này.
Nếu chúng ta nhìn vào regex được đề xuất rộng rãi cho câu hỏi này:
.*[^a]$
Chúng tôi sẽ thấy rằng nó gần như hoạt động. Nó không chấp nhận một chuỗi rỗng, có thể hơi bất tiện. Tuy nhiên, đây chỉ là một vấn đề nhỏ khi xử lý chỉ một nhân vật. Tuy nhiên, nếu chúng tôi muốn loại trừ toàn bộ chuỗi, ví dụ: "abc", thì:
.*[^a][^b][^c]$
sẽ không làm. Nó sẽ không chấp nhận ac, ví dụ.
Có một giải pháp dễ dàng cho vấn đề này mặc dù. Chúng ta có thể nói một cách đơn giản:
.{,2}$|.*[^a][^b][^c]$
hoặc phiên bản tổng quát hơn:
.{,n-1}$|.*[^firstchar][^secondchar]$
trong đó n là chiều dài của chuỗi bạn muốn cấm (đối với abc
nó là 3), và firstchar
, secondchar
... là đầu tiên, nhân vật thứ hai ... thứ n của chuỗi của bạn (ví abc
nó sẽ là a
, sau đó b
, sau đó c
).
Điều này xuất phát từ một quan sát đơn giản rằng một chuỗi ngắn hơn văn bản mà chúng tôi sẽ không cấm không thể chứa văn bản này theo định nghĩa. Vì vậy, chúng tôi có thể chấp nhận bất cứ điều gì ngắn hơn ("ab" không phải là "abc") hoặc bất cứ điều gì đủ dài để chúng tôi chấp nhận nhưng không có kết thúc.
Đây là một ví dụ về tìm kiếm sẽ xóa tất cả các tệp không phải là .jpg:
find . -regex '.{,3}$|.*[^.][^j][^p][^g]$' -delete