2011-10-18 25 views
5

Tôi đang cố gắng sử dụng đối sánh mẫu để tìm tất cả các tệp trong thư mục có phần mở rộng là .jpg hoặc jpeg.Mẫu đối sánh Bash

ls *.[jJ][pP][eE][gG] < - điều này rõ ràng sẽ chỉ tìm thấy phần mở rộng tệp .jpeg. Câu hỏi đặt ra là, làm cách nào để thực hiện tùy chọn [eE?

Trả lời

6

Khớp khó hơn.

ls *.[jJ][pP]{[eE],}[gG] 
+0

Cảm ơn rất nhiều, đó là chính xác những gì tôi đang tìm kiếm :) – Elliot

2

Cũng như các tiêu chuẩn mẫu (đơn giản) glob, bash ≥4.0 đã mở rộng globbing.
Đây là off by default. Để bật tính năng này, hãy sử dụng: shopt -s extglob

Với extglob bạn có quyền truy cập vào các mẫu biểu thức chính quy mở rộng cũng như các mẫu chuẩn. Hơn nữa, trong tình huống cụ thể của bạn, bạn có thể điều chỉnh hành vi của glob hơn nữa bằng cách bật một số case insensitive glob, cũng bị tắt theo mặc định. Để bật tính năng này, hãy sử dụng: shopt -s nocaseglob

Bật extglob không làm thay đổi cách hoạt động của bóng tiêu chuẩn. Bạn có thể kết hợp hai hình thức. Vấn đề duy nhất là bạn phải nhận thức được cú pháp regex mở rộng đặc biệt. ví dụ, trong ví dụ dưới đây, phần duy nhất của nó là một regex mở rộng, là ?(e). Phần còn lại là mở rộng glob tiêu chuẩn, với trường hợp vô hiệu hóa được kích hoạt.

Các mở rộng-regex, case-insensitive glob cho tình hình của bạn là:

shopt -s extglob nocaseglob 
ls -l *.jp?(e)g 

Bạn có thể tìm thêm thông tin và ví dụ tại địa chỉ: Bash Extended Globbing.

+0

Thực ra, Bash đã mở rộng globbing trong bash-2.02-alpha1 (tức là _long_ thời gian trước - như 15 năm). Cho dù bật hoặc tắt theo mặc định có thể được chọn khi './Configure' chạy (tức là trước khi biên dịch). Trong thực tế, phiên bản mà nó đã được giới thiệu được hiển thị tại liên kết mà bạn đã cung cấp cho cài đặt mặc định của nó. –

Các vấn đề liên quan