Làm thế nào để tìm và đếm có bao nhiêu tập tin chứa một từ nhất định?


7

Tôi phải tìm và hiển thị số lượng tập tin có chứa từ cà rốt (trường hợp bị bỏ qua)

Cho đến nay đây là những gì tôi có, tôi chỉ không chắc chắn làm thế nào để thêm wc vào đó để đếm xem có bao nhiêu tệp có chữ cà rốt

tìm thấy . -exec grep -i cà rốt {} \;


Làm thế nào tôi có thể làm điều đó bằng cách sử dụng lệnh find? Xin lỗi vì không chỉ định.
John

1
Tại sao bạn muốn sử dụng find? grep -rlà đệ quy.
Marco

Câu trả lời:


13

Trước hết, như những người khác đã nói, không có lý do để sử dụng find, chỉ sử dụng đệ quy grep:

grep -irm 1 carrot . | wc -l 

Việc -m 1đảm bảo grepsẽ dừng tìm kiếm từng tệp sau trận đấu đầu tiên. Không có nó, bạn sẽ không đếm số lượng tệp chứa carrotnhưng số lượng dòng , cùng một tệp sẽ được tính nhiều lần nếu nó chứa nhiều phiên bản của carrot. Từ man grep:

    -r, --recursive
          Read all files  under  each  directory,  recursively,  following
          symbolic  links  only  if they are on the command line.  This is
          equivalent to the -d recurse option.
   -i, --ignore-case
          Ignore  case  distinctions  in  both  the  PATTERN and the input
          files.  (-i is specified by POSIX.)
   -m NUM, --max-count=NUM
          Stop reading a file after NUM matching lines. 

Nếu bạn thực sự, thực sự muốn làm điều đó với tìm kiếm, bạn có thể làm

find . -type f -exec grep -im 1 carrot {} \; | wc -l

Lưu ý rằng tôi đang chỉ định -type fvì bạn không muốn grepthư mục.


1
Điều này không đúng. Cung cấp -m 1sẽ dừng sau một trận đấu, không phải một trận đấu cho mỗi tệp. Vì vậy, điều này thực sự sẽ luôn luôn quay trở lại 1. Tôi nghĩ rằng giải pháp thứ hai thực hiện chính xác mặc dù.
Phonon

@Phonon không nó sẽ không, hãy thử nó. Ít nhất là trên hệ thống Linux của tôi, nó tìm thấy kết quả khớp đầu tiên trong mỗi tệp. grep -rvẫn xử lý các tệp riêng lẻ, nó không chỉ là cattất cả chúng.
terdon

4

Tìm số tập tin chứa từ cà rốt

number_of_files=`grep -l -r -i "carrot" . | wc -l`

Ý nghĩa cho các grepđối số:

-l, --files-with-matches
         Only the names of files containing selected lines are written to standard output.  grep will only search a file until a match has been found, making
         searches potentially less expensive.  Pathnames are listed once per file searched.  If the standard input is searched, the string ``(standard
         input)'' is written.

-R, -r, --recursive
         Recursively search subdirectories listed.

-i : case insenstive

wc -l: in ra số lượng dòng được truyền làm đầu vào cho chương trình. Trong trường hợp của chúng tôi, những dòng này là tên của các tệp có mẫu đầu vào phù hợp được tìm thấy bởi grep.

In đầu ra

echo $number_of_files

1
@Downvoter quan tâm bình luận lý do?
smRaj

Tôi đã không downvote nhưng điều này không đếm số lượng tệp có chứa một chuỗi, nó đếm số dòng có chứa nó. Nếu một tệp có ba dòng khớp với mẫu bạn đang tìm kiếm, nó sẽ được tính ba lần. Ngoài ra, bạn không cần wckể từ khi grep-clựa chọn. Thêm -c-m 1để tránh trùng lặp.
terdon

@terdon: Tôi không đủ uy tín để nhận xét về câu trả lời của bạn. Vì vậy, tôi đang đặt nó ở đây, OP cần tổng số tệp có chứa từ "củ cà rốt". Bạn grep -ircm 1 carrot .không đưa ra số lượng tệp có chứa một chuỗi. Thay vào đó, tùy chọn -c cung cấp số lượng khớp cho mẫu tìm kiếm được tìm thấy trên mỗi cơ sở tệp. Thí dụ; filename1:count filename2:count. Tôi không chắc câu trả lời của bạn sẽ hữu ích cho mục đích mà OP yêu cầu
smRaj

@terdon: Ngoài ra grep -ircm 1 carrot ., grep in ra tên tệp ngay cả khi nó không chứa carrotsố 0 như:file_name1:0 file_name2:0
smRaj

Bạn hoàn toàn đúng, phục vụ tôi ngay vì đã đăng quá nhanh, cảm ơn. -lcũng tốt hơn -mnhưng này, tôi sẽ làm theo cách của tôi vì bạn đã sử dụng nó :)
terdon

3

Một biến thể của giải pháp smRaj sẽ là một lệnh grep kép. Sau đây sẽ cho kết quả tương tự như grep [ etc ] | wc -l :

grep -l -r -i "carrot" . | grep -c .

Sau đây sẽ in một danh sách đánh số các tập tin có chứa từ được tìm kiếm.

grep -l -r -i "carrot" . | grep -n .

+1 Tôi sẽ trả lời chính xác một số điều khi tôi thấy rằng bạn đã có :)
Joseph R.
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.