Làm cách nào để kết hợp find và grep để tìm kiếm đệ quy các tệp str hoặc str2 trong các tệp * .html và * .php từ / home / smith / sourcecode?


2

Làm cách nào tôi có thể kết hợp findgreptìm kiếm str1hoặc str2, đệ quy, trong tất cả các tệp * .html và * .php bắt đầu từ một thư mục có tên / home / smith / source? Đầu ra chỉ cần liệt kê các tệp (có đường dẫn), không phải chuỗi khớp thực tế. Tôi đã thử nhiều biến thể mà không thành công. Có rất nhiều ví dụ về cách thực hiện điều này cho một mẫu tệp hoặc một chuỗi, nhưng không phải nhiều mẫu tệp và nhiều chuỗi - theo cách đệ quy .

linux  bash  search  grep  find 

Câu trả lời:


4

Những người khác đều đúng, nhưng với một phiên bản hiện đại của grep có sẵn, theo ý kiến ​​của tôi thì quá mức cần thiết. Sau đây sẽ chỉ quét đệ quy các tệp có phần mở rộng .html hoặc .php và trả về tên tệp với đường dẫn của mỗi tệp có ít nhất một dòng khớp với str1 hoặc str2. Lưu ý rằng các -etùy chọn lặp lại cho phép đặc tả nhiều đường dẫn mà không cần sử dụng cú pháp regex để làm như vậy.

grep -r --files-with-Match --include ' .html' --include ' .php' -e str1 -e str2 / home / smith / source

Một công cụ, một quy trình, không cần thêm hoặc quét các tệp không liên quan. Chỉ cần một phiên bản gnu grep tương đối gần đây cho tùy chọn --incoide, không thành công rằng bạn sẽ phải thực hiện một grep nhiều giai đoạn như đề xuất của người khác.


3
egrep 'string1|string2' /home/smith/source/*.{html,php}

hoặc xem xét bất kỳ loại tệp đệ quy nào trong một thư mục,

egrep -R 'string1|string2' /home/smith/source

bạn có thể kết hợp nó với một egrep khác trong đường ống:

egrep -R 'string1|string2' /home/smith/source | egrep '.html|.php'

1

Sử dụng egrepvà sử dụng | để chỉ định str1 hoặc str2-:

find /home/smith/source -name \*.html -o -name \*.php -exec egrep -H 'str1|str2' {} \;

Điều đó hiển thị văn bản phù hợp, không phải tên tệp, nhưng điều đó không sao (Tôi đã cập nhật các câu hỏi có thể trong khi bạn đang trả lời câu hỏi hiện có). Làm cách nào tôi có thể khái quát hóa điều này nếu tôi muốn tìm kiếm các mẫu tệp 3,4,5 hoặc n?

-H tùy chọn egrep sau đó để đầu ra filepaths. str1 | str2 | str3..etc sẽ hoạt động - đó có phải là ý của bạn bằng cách khái quát hóa?
suspectus

Có, nhưng tôi cũng có nghĩa là tổng quát hóa mẫu tệp (ví dụ: * .php và * .html và * .txt và ...). Điều này dường như để làm điều đó:find /home/smiths/source -type f -regextype posix-egrep -regex ".*\.(php|html)$" -exec egrep -H -n "str1|str2|str3" '{}' \;


0

Đừng quên rằng shell của bạn tiện lợi hơn nhiều so với việc findbạn chỉ muốn tìm các tệp theo tên!

Bash:

shopt -s nullglob globstar
grep -lE 'str1|str2' /home/smith/source/**/*.{html,php}

Cá:

grep -lE 'str1|str2' /home/smith/source/**.{html,php}
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.