Câu hỏi Làm cách nào để grep đệ quy?


Làm cách nào để đệ quy grep tất cả các thư mục và thư mục con?

find . | xargs grep "texthere" *

1350
2018-01-01 05:10


gốc


@ TC1 Điều đáng buồn là grep chính nó có thể trả lời câu hỏi (ít nhất là GNU grep): grep --help | grep đệ quy - Frank Schmitt
Nếu bạn thấy mình thường xuyên sử dụng grep để thực hiện tìm kiếm đệ quy (đặc biệt nếu bạn tự thực hiện rất nhiều tập tin / thư mục exlusions), bạn có thể tìm thấy ack (một lựa chọn grep rất thân thiện với lập trình viên) hữu ích. - Nick McCurdy
Trên thực tế, không phải công việc -r cũng như - không hoạt động trên hộp Solaris mà tôi sử dụng tại nơi làm việc. Và trang người đàn ông cho grep không đề cập đến bất cứ điều gì đệ quy. Tôi đã phải nghỉ mát để tìm và xargs bản thân mình. - Ben
ag là cách yêu thích của tôi để làm điều này ngay bây giờ github.com/ggreer/the_silver_searcher - dranxo
grep -rin xlsx *.pl không làm việc cho tôi trên Redhat Linux. Tôi gặp lỗi "không khớp". - Bulrush


Các câu trả lời:


grep -r "texthere" .

Tham số đầu tiên biểu diễn cụm từ thông dụng để tìm kiếm, trong khi tham số thứ hai thể hiện thư mục cần tìm kiếm. Trong trường hợp này, . có nghĩa là thư mục hiện tại.

Lưu ý: Điều này làm việc cho GNU grep, và trên một số nền tảng như Solaris, bạn phải sử dụng cụ thể GNU grep như trái ngược với việc triển khai kế thừa. Đối với Solaris, đây là ggrep chỉ huy.


2035
2018-01-01 05:11



Lưu ý: "grep -r" chỉ hoạt động trên greps mới hơn. Nó không hoạt động trên grep đi kèm với AIX 5.3 ví dụ. - Withheld
Sử dụng grep -R để theo dõi các liên kết tượng trưng. - Eloff
Nó là tốt để biết rằng "-i" sẽ làm cho nó trường hợp không nhạy cảm, và "-n" cũng bao gồm số dòng cho mỗi kết quả phù hợp. - Sadegh
cũng tốt để biết, nếu bạn chỉ tìm kiếm một chuỗi cố định và không phải là một regex, sử dụng tùy chọn -F. nó sẽ giúp bạn tiết kiệm thời gian bằng cách không gọi trình phân tích cú pháp regex. rất tiện dụng nếu bạn đang tìm kiếm nhiều tệp. - Jeff
alias rgrep = 'grep -r' - totten


Nếu bạn biết phần mở rộng hoặc mẫu của tệp bạn muốn, một phương pháp khác là sử dụng --include Tùy chọn:

grep -r --include "*.txt" texthere .

Bạn cũng có thể đề cập đến các tệp để loại trừ --exclude.

Ag

Nếu bạn thường xuyên tìm kiếm thông qua mã, Ag (The Silver Searcher) là một lựa chọn thay thế nhanh hơn nhiều cho grep, đó là tùy chỉnh để tìm kiếm mã. Ví dụ, nó đệ quy theo mặc định và tự động bỏ qua các tệp và thư mục được liệt kê trong .gitignore, vì vậy bạn không phải tiếp tục chuyển các tùy chọn loại trừ rườm rà tương tự như grep hoặc tìm.


570
2017-12-30 22:59



Hoạt động tốt với grep đi kèm với Linux & Cygwin, nhưng không phải với một grep đi kèm với AIX. - Withheld
@KrzysztofWolny: `` thay vì = hoạt động tốt trên Ubuntu. PS: đó là nghĩa vụ phải là một không gian backticked, nhưng phân tích cú pháp đánh dấu SO thất bại. - Dan Dascalescu
@DanDascalescu Tôi upvoted cho grep, không phải cho Ag, chỉ để bạn biết :) - Bernhard
Chúng tôi có tùy chọn để loại trừ thư mục trong khi tìm kiếm đệ quy không? - rm -rf


Cũng thế:

find ./ -type f -print0 | xargs -0 grep "foo"

nhưng grep -r là một câu trả lời tốt hơn.


106
2018-01-01 05:14



+1 vì tính năng này hoạt động trên HP-UX trong đó "grep -r" thì không. Cảm ơn. - Damo
Hoặc nếu bạn không muốn lo lắng về không gian trong tên tệp find . -type f -exec grep "foo" '{}' \; hoạt động tốt khi được hỗ trợ. - Edd Steel
+1 vì điều này hoạt động trên AIX, trong đó "grep -r" thì không. - Withheld
Nếu bạn định tìm đường ống qua xargs tới grep, AND nếu bạn chỉ tìm kiếm một chuỗi cố định (ví dụ, không phải là regex), bạn có thể hưởng lợi từ việc gọi tùy chọn grep -F, vì vậy grep sẽ không tải công cụ regex cho mỗi lời gọi. Nếu có rất nhiều tệp, nó sẽ nhanh hơn nhiều. - Jeff
tìm thấy . -type f -exec grep -Hu "foo" {} \; là những gì tôi sử dụng vì nó cung cấp tên tệp. - Wes


Bây giờ tôi luôn sử dụng (ngay cả trên Windows với GoW - Gnu trên Windows):

grep --include="*.xxx" -nRHI "my Text to grep" *

Điều đó bao gồm các tùy chọn sau:

--include=PATTERN

Recurse trong thư mục chỉ tìm kiếm tập tin phù hợp PATTERN.

-n, --line-number

Tiền tố mỗi dòng đầu ra với số dòng trong tập tin đầu vào của nó.

-R, -r, --recursive

Đọc tất cả các tệp theo từng thư mục, đệ quy; điều này tương đương với -d recurse Tùy chọn.

-H, --with-filename

In tên tệp cho mỗi trận đấu.

-I     

Xử lý tệp nhị phân như thể nó không chứa dữ liệu phù hợp;
  điều này tương đương với --binary-files=without-match Tùy chọn.

Và tôi có thể thêm 'i'(-nRHIi), nếu tôi muốn kết quả phân biệt chữ hoa chữ thường.

Tôi co thể lây:

/home/vonc/gitpoc/passenger/gitlist/github #grep --include="*.php" -nRHI "hidden" *
src/GitList/Application.php:43:            'git.hidden'      => $config->get('git', 'hidden') ? $config->get('git', 'hidden') : array(),
src/GitList/Provider/GitServiceProvider.php:21:            $options['hidden'] = $app['git.hidden'];
tests/InterfaceTest.php:32:        $options['hidden'] = array(self::$tmpdir . '/hiddenrepo');
vendor/klaussilveira/gitter/lib/Gitter/Client.php:20:    protected $hidden;
vendor/klaussilveira/gitter/lib/Gitter/Client.php:170:     * Get hidden repository list
vendor/klaussilveira/gitter/lib/Gitter/Client.php:176:        return $this->hidden;
...

83
2018-02-14 09:33



Câu trả lời tôi đến đây không mong đợi để tìm. +1 - clintonmonk
Gow trông đầy hứa hẹn - mới hơn các tiện ích GNU Windows mà tôi đã sử dụng. Đang thử ngay bây giờ ... - Radim Cernej
ý nghĩa của nhân vật cuối cùng * ở đây là gì? - lorniper
@lorniper nó làm cho trình bao chọn tất cả các tệp và thư mục trong thư mục hiện tại của bạn, lần lượt grep áp dụng cho các tệp đó và (đệ quy vì -R tùy chọn) vào các thư mục. - VonC
@lorniper Noy chính xác: * hoặc là . là một mẫu glob (được diễn giải bởi shell): unix.stackexchange.com/a/64695/7490. '.'cũng sẽ chọn các thư mục chấm hoặc dấu chấm (như .git/) - VonC


Hoặc cài đặt ack, nếu bạn muốn một cách nhanh hơn và đang làm điều này rất nhiều.


53
2018-01-01 05:47



1 cho ack (AKA "ack-grep" trên một số bản phân phối). nó là grep -r trên steroid. - ZoogieZork
Thật không may, các phiên bản mới hơn của ack không còn có -a tùy chọn, do đó, nó sẽ bỏ qua các tệp có loại không xác định - Izkata
Sử dụng ag nếu bạn thực sự cần tốc độ. Thử nghiệm thô tôi vừa tìm kiếm /usr/share: grep so với ack so với fgrep so với ag = 1m12s so với 45s so với 43s so với 3s - sjas
Đây không phải là câu trả lời hoàn chỉnh. Làm thế nào để bạn cài đặt ack? Làm thế nào để bạn chạy ack? - styfle
Bạn có thể đã thêm điều này làm nhận xét thay vào đó. - Vimal Bhaskar


Trong các hệ thống POSIX, bạn không tìm thấy -r tham số cho grep và của bạn grep -rn "stuff" . sẽ không chạy, nhưng nếu bạn sử dụng find lệnh sẽ:

find . -type f -exec grep -n "stuff" {} \; -print

Đã đồng ý bởi Solaris và HP-UX.


19
2017-08-08 14:56



ý nghĩa của {} \; -print tương ứng? - user1169587
Trong -exec tùy chọn - biểu tượng {} là một tham chiếu đến tên tệp hiện được tìm thấy bởi find công cụ (đó là làm điều gì đó với tên tệp chúng tôi tìm thấy), cũng -exec tùy chọn nên được chấm dứt với ; biểu tượng (để đánh dấu kết thúc của các lệnh exec), nhưng bởi vì điều này là tất cả chạy trong một vỏ biểu tượng đó nên được thoát khỏi .. và cuối cùng -print tùy chọn cho phép find công cụ để in ra tên tập tin được tìm thấy trên màn hình. - rook


Để tìm tên của files với path đệ quy có chứa đặc biệt string sử dụng lệnh dưới đây cho UNIX:

find . | xargs grep "searched-string"

cho Linux:

grep -r "searched-string" .

tìm tệp trên UNIX máy chủ

find . -type f -name file_name

tìm tệp trên máy chủ LINUX

find . -name file_name

10
2018-01-29 14:31





ag là cách yêu thích của tôi để làm điều này ngay bây giờ github.com/ggreer/the_silver_searcher . Về cơ bản nó giống như ack nhưng với một vài tối ưu hơn.

Đây là một điểm chuẩn ngắn. Tôi xóa bộ nhớ cache trước mỗi bài kiểm tra (cf https://askubuntu.com/questions/155768/how-do-i-clean-or-disable-the-memory-cache )

ryan@3G08$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time grep -r "hey ya" .

real    0m9.458s
user    0m0.368s
sys 0m3.788s
ryan@3G08:$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time ack-grep "hey ya" .

real    0m6.296s
user    0m0.716s
sys 0m1.056s
ryan@3G08$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time ag "hey ya" .

real    0m5.641s
user    0m0.356s
sys 0m3.444s
ryan@3G08$ time ag "hey ya" . #test without first clearing cache

real    0m0.154s
user    0m0.224s
sys 0m0.172s

8
2018-05-21 23:37





Nếu bạn chỉ muốn theo dõi các thư mục thực sự và không phải là các liên kết tượng trưng,

grep -r "thingToBeFound" directory

Nếu bạn muốn theo các liên kết tượng trưng cũng như các thư mục thực tế (hãy cẩn thận với đệ quy vô hạn),

grep -R "thing to be found" directory

Vì bạn đang cố gắng grep đệ quy, các tùy chọn sau cũng có thể hữu ích cho bạn:

-H: outputs the filename with the line

-n: outputs the line number in the file

Vì vậy, nếu bạn muốn tìm tất cả các tệp có chứa Darth Vader trong thư mục hiện tại hoặc bất kỳ thư mục con nào và nắm bắt tên tệp và số dòng, nhưng không muốn đệ quy theo các liên kết tượng trưng, ​​lệnh sẽ là

grep -rnH "Darth Vader" .

Nếu bạn muốn tìm tất cả các đề cập đến từ mèo trong thư mục

/home/adam/Desktop/TomAndJerry 

và bạn đang ở trong thư mục

/home/adam/Desktop/WorldDominationPlot

và bạn muốn nắm bắt tên tệp nhưng không phải là số dòng của bất kỳ thể hiện nào của chuỗi "mèo" và bạn muốn đệ quy theo các liên kết tượng trưng nếu nó tìm thấy chúng, bạn có thể chạy một trong các cách sau

grep -RH "cats" ../TomAndJerry                   #relative directory

grep -RH "cats" /home/adam/Desktop/TomAndJerry   #absolute directory

Nguồn:

chạy "grep --help"

Giới thiệu ngắn gọn về các liên kết tượng trưng, ​​cho bất kỳ ai đọc câu trả lời này và bối rối bởi tham chiếu của tôi với họ: https://www.nixtutor.com/freebsd/understanding-symbolic-links/


8
2017-08-03 20:08





chỉ các tên tập tin cũng có thể hữu ích

grep -r -l "foo" .

8
2017-12-03 17:48





Điều này sẽ hoạt động:

grep -R "texthere" *

5
2017-12-19 07:20