Tìm tệp chứa chuỗi nhất định bằng find (1) và grep (1)


70

find . -type f -print -exec cat {} \; | grep some string

Lệnh trên không in đường dẫn tệp.

Tôi đang sử dụng : Ubuntu, bash 4.


Có thể nó không đáp ứng kết quả mong đợi của bạn vì bộ lọc grep. Điều gì về điều này:find . -type f -fprint /dev/stderr -exec cat {} \; | grep some string
artistoex

Mục tiêu bạn muốn đạt được là gì? Khi đầu ra, bạn đang nhận được chuỗi ký tự từ các tệp, bạn muốn đường dẫn của các tệp đó?
mirkobrankovic

Có, tôi muốn in đường dẫn của các tệp chứa chuỗi 'một số chuỗi'. @artistoex đề nghị in tất cả các đường dẫn tập tin.
H.Rabiee

Bạn có thể chỉ đơn giản muốn sử dụng ackđể grep qua tất cả các tệp trong thư mục hiện tại, có thể chỉ lọc trên một số loại tệp nhất định.
Jaap Eldering

Câu trả lời:


87

Đó là bởi vì bạn đang cung cấp grepmột luồng văn bản có chứa tên tệp. Vì bạn không cung cấp tên tệp làm đối số cho grep, nên không thể suy ra tập tin mà một dòng trùng khớp đến từ đâu. Sử dụng xargs:

find . -type f -print | xargs grep "some string"

Vì bạn có GNU find / xargs, đây là cách an toàn hơn để xargs đọc tên tệp:

find . -type f -print0 | xargs -0 grep "some string"

Nếu bạn chỉ muốn tên tệp có dòng trùng khớp mà không hiển thị dòng phù hợp:

find . -type f -print0 | xargs -0 grep -l "some string"

Làm cách nào để kết hợp các lệnh trên với tìm kiếm & thay thế? Như trong, grep rồi sed?
CMCDragonkai

1
đường dẫn find | grep xuất ra tên tệp, vì vậy:sed '...' $(find ... | xargs grep -l ...)
glenn jackman

107

tôi sử dụng

grep "some string" . -R

và nó hoạt động nhanh hơn

ps

Trường hợp sử dụng phức tạp hơn

grep -HiRE "some string|other string" . #H for file printing, i for case-insensitive, R for recursive search, E for regex 

Để đọc param tôi giải thích

grep --help | grep -- -i

17
-nnếu bạn muốn số dòng. +1 cho câu trả lời đơn giản.
Chad Skeeter

@ChadSkeeter chính xác. Sử dụng tìm không đưa ra giải pháp như vậy.
ArcherGodson

1
Điều này nên được đánh dấu là câu trả lời chính xác, phải trung thực. Các chi tiết hiện đang được chọn một cái gì đó hoàn toàn khác.

12

Tôi thường tìm kiếm mã nguồn trong các cấu trúc thư mục phức tạp và tôi thấy hữu ích khi sử dụng:

cd /your/folder/
grep -rHino "your string"

Với các tham số đó, không sử dụng find , tôi có được đường dẫn đầy đủ của tệpsố dòng chứa chuỗi đã chỉ định .

Nó cũng dễ nhớ vì nó BASH es thông qua tìm kiếm của bạn như một rHino :)

Tôi sẽ chỉ ra cách thức này hoạt động với một ví dụ nhanh.

Hãy hiển thị nội dung của tệp bằng cat:

jeeves ~ # cat fw.stop
#!/bin/sh
echo "Stopping firewall and allowing everyone..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

Và hãy tìm kiếm đệ quy cho tất cả các tệp có chứa chuỗi "iptables -P":

jeeves ~ # grep -rinHo "iptables -P"
fw.stop:9:iptables -P
fw.stop:10:iptables -P
fw.stop:11:iptables -P

Như bạn có thể thấy trong đầu ra, chúng ta có tên tệp: hit row: chuỗi tìm kiếm

Dưới đây là mô tả chi tiết hơn về các tham số được sử dụng:

-r Đối với mỗi toán hạng thư mục, hãy đọc và xử lý tất cả các tệp trong thư mục đó, theo cách đệ quy. Thực hiện theo các liên kết tượng trưng trên dòng lệnh, nhưng bỏ qua các liên kết tượng trưng được gặp đệ quy. Lưu ý rằng nếu không có toán hạng tệp nào được đưa ra, grep sẽ tìm kiếm thư mục làm việc. Điều này giống như tùy chọn '--directories = recurse'.

-i In tên tệp cho mỗi trận đấu. Đây là mặc định khi có nhiều hơn một tệp để tìm kiếm.

-n Tiền tố mỗi dòng đầu ra với số dòng dựa trên 1 trong tệp đầu vào của nó. (-n được chỉ định bởi POSIX.)

-H In tên tệp cho mỗi trận đấu. Đây là mặc định khi có nhiều hơn một tệp để tìm kiếm.

-o Chỉ in các phần trùng khớp (không trống) của các dòng khớp, với mỗi phần như vậy trên một dòng đầu ra riêng biệt. Các dòng đầu ra sử dụng cùng một dấu phân cách làm đầu vào và các dấu phân cách là byte rỗng nếu -z (--null-data) cũng được sử dụng (xem Tùy chọn khác).


2

Tôi thích

| tìm tập tin | làm cho grep ont tìm tập tin | hiển thị đường dẫn đầy đủ của tập tin

tìm / -type f -exec grep 'một số chuỗi' {} \; -exec echo {} \;


0

Silver Searcher là một ứng dụng rất nhanh và tiện dụng để tìm kiếm các tập tin và nội dung.

Để giải quyết vấn đề của bạn, lệnh tìm kiếm bạc sẽ như thế này ...

ag 'some string' -l

-l Chỉ in tên tệp có chứa kết quả khớp (không in các dòng trùng khớp)

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.