Số lượng tệp chứa một chuỗi đã cho


18

Làm cách nào tôi có thể đếm số lượng tệp (trong một thư mục) có chứa một chuỗi đã cho làm đầu vào trong bash / sh?

Câu trả lời:


29

grep -l "string" * | wc -l sẽ tìm kiếm "chuỗi" trong nội dung của tất cả các tệp trong thư mục làm việc và cho bạn biết có bao nhiêu kết quả khớp.


1
Điều này sẽ không hoạt động nếu có nhiều tệp trong thư mục, nó sẽ đưa ra lỗi "zsh: danh sách đối số quá dài: grep". Bất kỳ ý tưởng về làm thế nào để thoát khỏi điều này?

1
@ user16142 grep thư mục thay vì các tệp: grep -lr "string" directory | wc -lNếu bạn không muốn tìm kiếm đệ quy, bạn có thể sử dụng find với tùy chọn maxdepth: find directory -maxdepth 1 -type f -exec grep -l "string" {} + | wc -lLưu ý rằng tùy chọn thứ hai này chậm hơn grep.
Agargara

9

grepTham số s -lsẽ chỉ xuất ra tên tệp trùng khớp $PATTERN, wccó thể đếm chúng sau đó.

grep -l "$PATTERN" * | wc -l

cảm ơn, nhưng đã tự hỏi với một mẫu trong tệp ... xin lỗi vì câu hỏi mơ hồ

Nếu vậy, hãy lấy câu trả lời của Wolf.
vẫy

3
awk '/pattern_to_look_for/ {s+=1; nextfile;} END {print s}' *

Làm rõ: Điều này tìm kiếm số lượng tệp có "mẫu_to_look_for" trong nội dung của chúng chứ không phải trong tên tệp của chúng (như câu trả lời của Wag). Từ câu hỏi của bạn, thật khó để nói những gì bạn đang tìm kiếm.


Nhưng thiếu một cái gì đó? bởi vì nó không hoạt động

Nếu bạn tìm vịt chuỗi, bạn phải viết nó như / duck / trong Awk. Bạn đang làm điều đó?
Jan Persson

có, đầu ra: awk: lỗi đọc (Là một thư mục)

Câu trả lời của Wolf sẽ cho bạn bản sao. Nếu có một vài lần xuất hiện của chuỗi bạn đang tìm kiếm trong một trong các tệp, nó sẽ được tính là kết quả khớp thêm.
Jan Persson

Chà, nếu bạn có các thư mục trong thư mục, bạn phải thực hiện một số thứ bổ sung như thay thế ngôi sao bằng thứ gì đó như thế này find . ! -name . -prune -type f(đừng bỏ lỡ các backticks). Lệnh này chỉ liệt kê các tập tin trong thư mục.
Jan Persson

2

Điều này hoạt động trong Bash với bất kỳ tên tệp:

grep -lZ "$pattern" * | tr -cd '\000' | wc -c

Giải trình:

  • grep's -Ztùy chọn in tất cả các kết quả với một tách ␀-byte. Ký tự này không thể là một phần của tên tệp, vì vậy chúng ta chỉ cần đếm số lượng dấu phân cách để lấy số lượng tệp.
  • Để loại bỏ các ký tự khác trong đầu ra, chúng ta chỉ cần xóa mọi thứ trừ ␀ byte bằng cách sử dụng tr.
  • Sau đó chỉ cần đếm các ký tự với wc.
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.