2011-06-21 31 views
155

Tôi grepping qua một đống lớn các mã bởi git quản lý, và bất cứ khi nào tôi làm một grep, tôi thấy cọc và đống thông điệp có dạng:Làm thế nào tôi có thể có grep không in ra 'Không có tập tin hoặc thư mục' lỗi?

> grep pattern * -R -n 
whatever/.git/svn: No such file or directory 

Có cách nào tôi có thể làm cho những dòng biến đi?

+0

Những ngày này tôi khuyên bạn nên sử dụng 'ag',' ack' hoặc 'cgrep' thay vào đó - chúng nhanh hơn/tốt hơn' grep' để tìm kiếm kho lưu trữ mã. – lunixbochs

+0

Nếu bạn đang grepping thông qua mã và tìm cách để tránh các thư mục cụ thể, có lẽ bạn nên nhìn vào ack. Đó là một grep nhận biết mã nguồn, và như vậy sẽ chủ động bỏ qua các thư mục VCS đó (cũng như các bản sao lưu vi và emacs, các tệp không phải nguồn, vv). –

+0

Làm cách nào người dùng có thể nhận được 'Không có thư hoặc thư mục' nào cho các tệp và/hoặc thư mục tồn tại? Hoặc, ngược lại, làm cách nào để 'grep *' có thể nhận được tên của các tệp không tồn tại? Đây có phải là một điều kiện chủng tộc, nơi mà một số quá trình khác thao tác cây thư mục (tạo, đổi tên và xóa tệp) trong khi 'grep' đang chạy? – Scott

Trả lời

205

Bạn có thể sử dụng cờ -s hoặc --no-messages để chặn lỗi.

-s, --no-thông điệp ngăn chặn các thông báo lỗi

grep pattern * -s -R -n 
+9

@Alex @Dogbert Điều này trả lời câu hỏi, nhưng '-s' có thể che giấu các vấn đề, ví dụ: khi bạn sử dụng xargs với grep. Hãy thử tạo 2 tệp trong một thư mục, 'aaa.txt' và 'a b.txt', cả hai đều chứa chuỗi 'một số văn bản'. Lệnh '/ bin/ls -1 | xargs grep 'some text'' sẽ cung cấp cho bạn "không có tệp hoặc thư mục như vậy" vì nó chia nhỏ' b.txt 'thành 2 args. Nếu bạn ngăn chặn, bạn sẽ không nhận thấy bạn đã bỏ lỡ một tập tin. – Kelvin

5

lỗi như vậy thường được gửi đến các "tiêu chuẩn lỗi" suối, mà bạn có thể đường ống vào một tập tin hoặc chỉ cần đảm biến mất trên hầu hết các lệnh:

grep pattern * -R -n 2>/dev/null 
+0

Trả lời câu hỏi nhưng có thể che giấu các vấn đề. Xem bình luận của tôi dưới câu trả lời của Dogbert. – Kelvin

49

Nếu bạn đang tìm kiếm thông qua kho lưu trữ git, tôi khuyên bạn nên sử dụng git grep. Bạn không cần phải vượt qua trong -R hoặc đường dẫn.

git grep pattern 

Điều đó sẽ hiển thị tất cả các kết quả phù hợp từ thư mục hiện tại của bạn.

+3

+1 cho lệnh git cụ thể hữu ích. Sẽ không làm việc cho svn mặc dù :-) – cadrian

+2

+1 Lệnh git này tôi đã bị thiếu - điều này cho phép tôi grep cho một chuỗi từ trạng thái của cây trong bất kỳ cam kết nào (bằng cách thêm cam kết sau "mẫu"). – Kelvin

+0

Cuối cùng là lệnh tìm kiếm hợp lý. –

4

Tôi thường không để grep thực hiện thao tác đệ quy. Thường có một vài thư mục bạn muốn bỏ qua (.git, svn ...)

Bạn có thể làm bí danh thông minh với lập trường như một rằng:

find . \(-name .svn -o -name .git \) -prune -o -type f -exec grep -Hn pattern {} \; 

Nó có vẻ quá mức cần thiết ở cái nhìn đầu tiên, nhưng khi bạn cần lọc ra một số mẫu, nó khá tiện dụng.

+1

+1. Điều này là tốt hơn nhiều so với loại bỏ lỗi. Tuy nhiên, tôi nghĩ bạn đã quên '-exec' trước grep của bạn. – Kelvin

+0

của bạn là đúng, cảm ơn – cadrian

+0

Điều này có nghĩa là gì? '\ (-name .svn -o -name .git \)' – sbhatla

3

Bạn đã thử tùy chọn -0 trong xargs? Một cái gì đó như thế này:

ls -r1 | xargs -0 grep 'some text' 
+2

để tìm bạn nên thêm -print0 'find -print0 | xargs -0 grep 'text'' – aliva

3

Tôi đã thấy rằng xảy ra nhiều lần, với các liên kết bị hỏng (symlink trỏ đến file không tồn tại), grep cố gắng tìm kiếm trên các tập tin mục tiêu, mà không tồn tại (do đó thông báo lỗi chính xác và chính xác).

Tôi thường không bận tâm trong khi làm nhiệm vụ quản trị hệ thống qua giao diện điều khiển, nhưng từ bên trong kịch bản tôi tìm kiếm tập tin văn bản với "tìm thấy", và sau đó grep mỗi người:

find /etc -type f -exec grep -nHi -e "widehat" {} \; 

Thay vì:

grep -nRHi -e "widehat" /etc 
0

Sử dụng -I trong grep.

Ví dụ: grep SEARCH_ME -Irs ~/logs.

+0

'-I' bỏ qua các tệp nhị phân - nó tương đương với' --binary-files = without-match'. Nó không ngăn chặn "Không có tập tin hoặc thư mục" tin nhắn mặc dù. – mwfearnley

Các vấn đề liên quan