2009-12-12 24 views
7

Có cách nào tôi có thể sử dụng grep để bỏ qua một số tập tin khi tìm kiếm một cái gì đó, một cái gì đó tương đương với svnignore hoặc gitignore? Tôi thường sử dụng một cái gì đó như thế này khi tìm kiếm mã nguồn.Làm thế nào để tự động bỏ qua các tập tin trong grep

grep -r something * | grep -v ignore_file1 | grep -v ignore_file2 

Thậm chí nếu tôi có thể thiết lập bí danh để grep bỏ qua các tệp này sẽ là tốt.

+0

Đã thử một vài bí danh và hàm dẫn xuất, kết thúc bằng bật e lót tôi đăng dưới đây. Ý tưởng tuyệt vời! Đây là một bổ sung mới cho vỏ của tôi! – zen

+0

Bạn cũng có thể muốn kiểm tra biến GLOBIGNORE của bash. Điều này cho phép vỏ tinh chỉnh ý nghĩa của '*'. Không giúp bạn với grep -r, tất nhiên, nhưng đó là một điều tiện dụng để có trong hộp công cụ của bạn. –

Trả lời

8

tùy chọn --exclude trên grep cũng sẽ làm việc:

grep perl * --exclude=try* --exclude=tk* 

này tìm kiếm cho perl trong các tập tin trong thư mục hiện trừ tập tin bắt đầu với thử hoặc tk

+0

loại này giúp nhu cầu của tôi, --exclude và --exclude-dir – rampr

+0

Đây là cơ bản những gì tôi làm - ngoại trừ tôi biến nó thành một kịch bản trong thư mục bin của tôi, vì vậy hầu như không gõ. – khedron

+0

Tôi đã tạo bí danh cho grep với --exclude và exclude-dir và nhiều tùy chọn khác có màu, làm cho grep của tôi dễ dàng hơn bây giờ – rampr

1
find . -path ./ignore -prune -o -exec grep -r something {} \; 

gì mà không là tìm tất cả các file trong thư mục hiện tại của bạn không bao gồm các thư mục (hoặc file) có tên là "bỏ qua", sau đó thực hiện lệnh grep -r một cái gì đó trên mỗi tập tin được tìm thấy trong các tập tin không bị bỏ qua.

0

Tôi nghĩ grep không có tính năng lọc tên tệp. Để thực hiện những gì bạn đang cố gắng làm, bạn có thể kết hợp các lệnh find, xargs và grep. bộ nhớ của tôi không tốt, vì vậy ví dụ có thể không hoạt động:

find -name "foo" | xargs grep "pattern" 

Find là linh hoạt, bạn có thể sử dụng ký tự đại diện, ignore case, hoặc sử dụng biểu thức thông thường. Bạn có thể muốn đọc các trang hướng dẫn sử dụng để biết mô tả đầy đủ.

sau khi đọc bài tiếp theo, rõ ràng grep không có tính năng lọc tên tệp.

2

Bạn cũng có thể muốn có một cái nhìn tại ack, trong số nhiều tính năng khác, theo mặc định không tìm kiếm các thư mục VCS như .svn và .git.

0

Đây là phiên bản tối giản của .gitignore. Yêu cầu utils tiêu chuẩn: awk, sed (vì awk của tôi là rất khập khiễng), egrep:

cat > ~/bin/grepignore #or anywhere you like in your $PATH 
egrep -v "`awk '1' ORS=\| .grepignore | sed -e 's/|$//g' ; echo`" 
^D 
chmod 755 ~/bin/grepignore 
cat >> ./.grepignore #above set to look in cwd 
ignorefile_1 
... 
^D 
grep -r something * | grepignore 

grepignore xây dựng một điều khoản thay đổi luân phiên đơn giản:

egrep -v ignorefile_one|ignorefile_two 

không vô cùng hiệu quả, nhưng tốt cho việc tự sử dụng

1

sử dụng mở rộng vỏ

shopt -s extglob 
for file in !(file1_ignore|file2_ignore) 
do 
    grep ..... "$file" 
done 
Các vấn đề liên quan