Làm thế nào bạn sẽ đếm mọi lần xuất hiện của một thuật ngữ trong tất cả các tệp trong thư mục hiện tại? - và thư mục con (?)
Tôi đã đọc rằng để làm điều này bạn sẽ sử dụng grep
; lệnh chính xác là gì?
Ngoài ra, có thể ở trên với một số lệnh khác?
Làm thế nào bạn sẽ đếm mọi lần xuất hiện của một thuật ngữ trong tất cả các tệp trong thư mục hiện tại? - và thư mục con (?)
Tôi đã đọc rằng để làm điều này bạn sẽ sử dụng grep
; lệnh chính xác là gì?
Ngoài ra, có thể ở trên với một số lệnh khác?
Câu trả lời:
Sử dụng grep
+ wc
(điều này sẽ phục vụ cho nhiều lần xuất hiện của thuật ngữ trên cùng một dòng):
grep -rFo foo | wc -l
-r
trong grep
: tìm kiếm đệ quy trong hệ thống phân cấp thư mục hiện tại;-F
trong grep
: khớp với một chuỗi cố định thay vì chống lại một mẫu;-o
trong grep
: chỉ in phù hợp;-l
trong wc
: in số đếm của các dòng;% tree
.
├── dir
│ └── file2
└── file1
1 directory, 2 files
% cat file1
line1 foo foo
line2 foo
line3 foo
% cat dir/file2
line1 foo foo
line2 foo
line3 foo
% grep -rFo foo | wc -l
8
PCREs
không nên sử dụng vì chúng là thử nghiệm
-F
có lẽ sẽ nhanh hơn.
-F
thay vì -P
. Cảm ơn lời đề nghị tuyệt vời, cập nhật bằng cách sử dụng -F
, mà thực sự phù hợp hơn ở đây.
grep -Rc [term] *
sẽ làm điều đó. Các -R
lá cờ có nghĩa là bạn muốn đệ quy tìm kiếm thư mục hiện hành và tất cả các thư mục con của nó. Đây *
là một bộ chọn tệp có nghĩa: tất cả các tệp. Các -c
lá cờ làm cho grep
sản lượng chỉ số lần xuất hiện. Tuy nhiên, nếu từ xuất hiện nhiều lần trên một dòng, nó chỉ được tính một lần.
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.
-R, --dereference-recursive
Read all files under each directory, recursively. Follow all symbolic links, unlike -r.
Nếu bạn không có liên kết tượng trưng trong thư mục của bạn, không có sự khác biệt.
-c
cờ vào grep
. Sau đó, grep tự đếm và bạn không cầnwc
--
trước*
*
chí chỉ mở rộng thành không phải là dotfiles, vì vậy bạn bỏ lỡ tất cả những thứ đó. Nó có ý nghĩa hơn khi chỉ sử dụng "." vì dù sao bạn cũng sẽ xử lý các đối số theo cách đệ quy - và điều đó sẽ nhận được các tệp chấm. Vấn đề lớn hơn ở đây là điều này sẽ có thể số lượng dòng, không phải số lần xuất hiện của một từ. Nếu thuật ngữ xuất hiện nhiều lần trên một dòng, nó sẽ chỉ được tính một lần bởi "grep -c"
Trong một kịch bản python nhỏ:
#!/usr/bin/env python3
import os
import sys
s = sys.argv[1]
n = 0
for root, dirs, files in os.walk(os.getcwd()):
for f in files:
f = root+"/"+f
try:
n = n + open(f).read().count(s)
except:
pass
print(n)
count_string.py
.Chạy nó từ thư mục với lệnh:
python3 /path/to/count_string.py <term>
# get the current working directory
currdir = os.getcwd()
# get the term as argument
s = sys.argv[1]
# count occurrences, set start to 0
n = 0
# use os.walk() to read recursively
for root, dirs, files in os.walk(currdir):
for f in files:
# join the path(s) above the file and the file itself
f = root+"/"+f
# try to read the file (will fail if the file is unreadable for some reason)
try:
# add the number of found occurrences of <term> in the file
n = n + open(f).read().count(s)
except:
pass
print(n)
root
và f
cho?
root
là đường dẫn đến tệp bao gồm "ở trên" thư mục hiện tại, f
là tệp. Ngoài ra, os.path.join()
có thể được sử dụng, nhưng dài dòng hơn.
n = n + open(f).read().count(s)
?