Grep, bỏ qua cảnh báo


50

Tôi đang cố gắng tìm thư mục cài đặt của một gói cụ thể. Tôi có một từ khóa nhất định sử dụng mà tôi đang cố gắng tìm một tệp cụ thể.

Trong grep, tôi chỉ muốn bao gồm loại tệp cpp hoặc h . Tôi không muốn grep hiển thị các cảnh báo như Quyền bị từ chối hoặc Không thể tìm thấy Thư mục . Tôi chỉ muốn nó hiển thị các tập tin phù hợp, không có gì khác. Xin đề nghị làm thế nào tôi có thể làm điều này?

Hiện tại tôi đang sử dụng

grep "My term" -ir --exclude-dir="\.svn" --include=*.{cpp,h} ./

Câu trả lời:


56

Những cảnh báo này được hướng đến stderrluồng, trái ngược với mô tả tệp ra tiêu chuẩn. Bạn có thể tắt đầu ra stderr bằng cách thêm 2>/dev/nullvào cuối lệnh của bạn.


Cụ thể hơn find . 2>/dev/null | grep 404.htmllà một lệnh sẽ trông như thế nào
csga5000

30

Trực tiếp hơn là lọc các cảnh báo bạn có thể vô hiệu hóa chúng bằng cách thêm -s:

grep "My term" -sir --exclude-dir="\.svn" --include=*.{cpp,h} ./

Có một số vấn đề tương thích với tùy chọn này. Tuy nhiên, đây không phải là một vấn đề cho sử dụng cá nhân.

-s, --no-message: Loại bỏ các thông báo lỗi về các tệp không tồn tại hoặc không thể đọc được. Lưu ý về tính di động: không giống như GNU grep, Unix grep phiên bản thứ 7 không tuân thủ POSIX, vì nó thiếu -q và tùy chọn -s của nó hoạt động giống như tùy chọn -q của GNU grep. Grep kiểu USG cũng thiếu -q nhưng tùy chọn -s của nó hoạt động giống như GNU grep. Các tập lệnh shell di động nên tránh cả -q và -s và nên chuyển hướng đầu ra tiêu chuẩn và lỗi thành / dev / null. (-s được chỉ định bởi POSIX.)


Tôi mới cài đặt 13.04 và tôi nhận được các lỗi mà tôi không gặp phải với 12.04. Nó có thể là một cái gì đó thay đổi? Tôi nghĩ thật tuyệt khi grep sẽ ngừng cảnh báo về các tệp là thư mục vì trong hầu hết các trường hợp tôi không quan tâm!
Alexis Wilke

Xin lỗi, tôi vẫn ở vào ngày 12.10, vì vậy tôi không thể xác nhận điều này.
Sebastian nôn Meer

5

Tôi đã từng nhận được rất nhiều tin nhắn phiền phức như thế này:

grep: commands: Is a directory
grep: events: Is a directory
grep: views: Is a directory

Lý do là --directoriescờ được mặc định read. Tôi đã thay đổi nó thành recurse; nếu bạn không muốn nó tự động thực hiện tìm kiếm đệ quy, bạn có thể sử dụng skipthay thế.

Cách dễ nhất để xử lý việc này mọi lúc là đặt nó trong một biến môi trường. Trong ~/.bash_profilehoặc ~/.bashrctùy thuộc vào bản phân phối của bạn:

export GREP_OPTIONS='--directories=recurse'

Bây giờ nó tự động chặn những tin nhắn đó bất cứ khi nào tôi sử dụng grep.

Một lựa chọn khác là --no-messagescờ, tốc ký -s. Điều này cũng sẽ loại bỏ các Is a directorytin nhắn, nhưng nó cũng ngăn chặn các tin nhắn khác có thể hữu ích hơn. Ví dụ: nếu bạn đang thực hiện tìm kiếm lồng nhau */*/*và không có tệp nào của mẫu đó tồn tại, nó sẽ không cho bạn biết điều đó.


khám phá tốt
aldr

1

Cách tiếp cận khác thay vì thực hiện grepđệ quy với -ir sẽ là để cho findlệnh (được đệ quy theo mặc định) xử lý các quyền với -readablecờ và đường dẫn để loại trừ bằng -not -path "*.svn*"cờ và sau đó chuyển tệp tới grep. Loại trừ các thư mục được thực hiện thông qua -type fđể chỉ tìm các tệp thông thường.

$ find . -not -path "*.svn*" -type f -name "*.cpp" -or -name "*.h"  -readable -exec grep "my terms" "{}" \; 

0

Khi thực hiện tìm kiếm đệ quy trong các tệp cụ thể, bạn nên sử dụng tốt hơn nhiều ack-grep. Cú pháp ở đây sẽ là:

ack-grep -i "My term" --cpp --h

Để xóa các thông báo lỗi cấp phép, bạn có thể muốn chạy cùng một lệnh với sudo:

ack-grep -i "My term" --cpp --h

Nhưng cuối cùng, nếu bạn muốn tìm kiếm các gói đã cài đặt, hãy xem các tùy chọn khác nhau đó: https://www.google.com.vn/search?q=ubfox%20search%20inside%20installed%20packages

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.