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ú 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:
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 -or
hoặ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
Vì -or
có quyền ưu tiên thấp hơn so với phần ngụ ý -and
giữa -type
và phần -name
đặt tên đầu tiên vào dấu ngoặc đơn theo đề xuất của Chris.
). 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').
Đâ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\)"
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).