Làm cách nào để grep không in ra lỗi 'Không có tệp hoặc thư mục như vậy'?


215

Tôi đang gồng mình qua một đống mã lớn được quản lý bởi git và bất cứ khi nào tôi thực hiện một grep, tôi thấy hàng đống tin nhắn có dạng:

> 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 mất?


1
Ngày nay, tôi khuyên bạn nên sử dụng ag, ackhoặc cgrepthay vào đó - chúng nhanh hơn / tốt hơn nhiều so grepvới tìm kiếm kho mã.
lunixbochs

Nếu bạn đang truy cập mã và tìm cách tránh các thư mục cụ thể, có lẽ bạn nên xem 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, v.v.).
Brian Agnew

2
Làm thế nào người dùng có thể nhận được No such file or directorytin nhắn cho các tập tin và / hoặc thư mục tồn tại? Hoặc, ngược lại, làm thế nào để có grep *đượ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, trong đó một số quy trình khác thao túng cây thư mục (tạo, đổi tên và xóa các tệp) trong khi grepđang chạy?
Scott

Câu trả lời:


299

Bạn có thể sử dụng -shoặc --no-messagescờ để loại bỏ lỗi.

-s, --no-tin nhắn ngăn chặn thông báo lỗi

grep pattern * -s -R -n

14
@Alex @Dogbert Điều này không trả lời câu hỏi, nhưng '-s' có thể che giấu các vấn đề, ví dụ như 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 'a b.txt' thành 2 đối số. Nếu bạn kìm nén, bạn sẽ không nhận thấy bạn đã bỏ lỡ một tập tin.
Kelvin

@Kelvin thì có, ví dụ nếu tôi sử dụng findvà sử dụng print0với xargs -0Điều đó có giải quyết được vấn đề không? Cảm ơn
Luka

1
@Luka Điều đó sẽ giải quyết vấn đề. Bạn sẽ không gặp phải vấn đề nếu bạn luôn sử dụng các tùy chọn NUL đó, nhưng nếu bạn không, điều đó gần như được đảm bảo (IMHO) mà bạn sẽ quên vào thời điểm không thuận lợi nhất.
Kelvin

điều này hoạt động trên Mac OS X nơi các tùy chọn khác (--quiet) không
philshem

59

Nếu bạn đang đi qua một 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 đi vào -Rhoặc đường dẫn.

git grep pattern

Điều đó sẽ hiển thị tất cả các trận đấu từ thư mục hiện tại của bạn xuống.


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

2
+1 Đây là lệnh git 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

1
Với plugin chạy trốn, Ggrepcũng tìm kiếm bắt đầu từ đầu thư mục Git thay vì thư mục hiện tại.
Ciro Santilli 郝海东 冠状 病 事件 法轮功

Điều này dường như là nhanh hơn đáng kể so với grep tiêu chuẩn. (Có lẽ nó bỏ qua các tệp nhị phân, v.v? Không có ý tưởng, nhưng hữu ích.)
Daniel

10

Các lỗi như thế thường được gửi đến luồng "lỗi tiêu chuẩn", mà bạn có thể chuyển sang một tệp hoặc chỉ biến mất trên hầu hết các lệnh:

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

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

5

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 các tệp không tồn tại), grep cố gắng tìm kiếm trên tệp mục tiêu 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 thực hiện các tác vụ sysadmin trên bảng điều khiển, nhưng từ trong các tập lệnh, tôi tìm các tệp văn bản với "find", và sau đó grep từng cái:

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

Thay vì:

grep -nRHi -e "widehat" /etc

4

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

Bạn có thể thực hiện các bí danh thông minh với lập trường như thế:

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

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


1
+1. Điều này tốt hơn nhiều so với việc ngăn chặn lỗi. Tuy nhiên, tôi nghĩ rằng bạn đã quên -exectrước grep của bạn.
Kelvin

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

Tại sao không sử dụng các cờ --exclude hoặc --exlcude-dir của grep?
Choylton B. Higginbottom

1
@sbhatla dấu ngoặc đơn tạo một thứ tự các thao tác cho lệnh find. stackoverflow.com/questions/24338777/ cường
Choylton B. Higginbottom

4

Bạn đã thử -0tùy chọn trong xargs chưa? 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 -print0find -print0 | xargs -0 grep 'text'
aliva

1

Sử dụng -Itrong grep.

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


1
-Ibỏ 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 các tin nhắn "Không có tập tin hoặc thư mục" mặc dù.
mwfearnley

0

Tôi chuyển hướng stderrđến stdoutvà sau đó sử dụng in-match-match ( -v) của grep để loại trừ chuỗi cảnh báo / lỗi mà tôi muốn ẩn:

grep -r <pattern> * 2>&1 | grep -v "No such file or directory"
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.