Tìm tệp được lọc bởi nhiều tiện ích mở rộng


52

Cú pháp đúng cho:

find . -type f -name \*.\(shtml\|css\)

Điều này hoạt động, nhưng không phù hợp:

find . -type f -name \*.shtml > f.txt && find . -type f -name \*.css >> f.txt

Làm thế nào để làm như vậy, nhưng trong ít lần nhấn phím hơn?

Câu trả lời:


75

Bạn có thể kết hợp các biểu thức tìm kiếm khác nhau với các toán tử logic -orhoặc -and, vì vậy trường hợp của bạn có thể được viết dưới dạng

find . -type f \( -name "*.shtml" -or -name "*.css" \)

Điều này cũng cho thấy rằng bạn không cần phải thoát các ký tự shell đặc biệt khi bạn sử dụng dấu ngoặc kép.

Biên tập

-orcó quyền ưu tiên thấp hơn so với phần ngụ ý -andgiữa -typevà phần -nameđặt tên đầu tiên vào dấu ngoặc đơn theo đề xuất của Chris.


Điều đó cũng sẽ in các thư mục có tên "* .css".
Teddy

Hmm, các dấu ngoặc trong phiên bản cập nhật của bạn có một chút thất lạc. Các dấu ngoặc đơn cần kết thúc dưới dạng các tham số riêng biệt để tìm , vì vậy chúng cần khoảng trắng xung quanh chúng (`" .css ")` dẫn đến một giá trị chuỗi đơn; nó giống như (ví dụ) `' .css)' ). Second, the parentheses need to go around whole ‘primaries’ (the open parenthesis needs to be before -name`, không nằm giữa nó và 'toán hạng').
Chris Johnsen

15

Đây là một cách để làm phiên bản đầu tiên của bạn:

find -type f -regex ".*/.*\.\(shtml\|css\)"

12

Bạn cần phải ngoặc đơn để chỉ bao gồm các tệp:

find . -type f \( -name "*.shtml" -o -name "*.css" \) -print

Phần thưởng : đây là cú pháp tuân thủ POSIX.


4

Tôi thường thấy mình kết thúc bằng egrep, hoặc ống dài hơn hoặc perl cho các bộ lọc thậm chí phức tạp hơn:

find . -type f | egrep '\.(shtml|css)$'
find . -type f | perl -lne '/\.shtml|\.css|page\d+\.html$/ and print'

Nó có thể kém hiệu quả hơn một chút nhưng đó thường không phải là vấn đề đáng lo ngại và đối với những thứ phức tạp hơn thường dễ dàng hơn để xây dựng và sửa đổi.

Thông báo trước áp dụng về việc không sử dụng điều này cho các tệp có tên tệp lạ (ví dụ: chứa dòng mới).


+1 cho giải pháp sạch và mô-đun, các tắc nghẽn về hiệu suất thường xảy ra trong khi xử lý các tệp kết quả từ kết quả tìm kiếm.
Cristik
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.