Answers:
使用grep
+ wc
(这将满足该术语在同一行上的多次出现):
grep -rFo foo | wc -l
-r
in grep
:在当前目录层次结构中递归搜索;-F
in grep
:匹配固定字符串而不是模式;-o
in grep
:仅打印匹配项;-l
in wc
:打印行数;% 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
不应该使用它们,因为它们是实验性的
-F
可能会更快。
-F
而不是-P
。感谢您的伟大建议,使用进行更新-F
,确实更适合此处。
grep -Rc [term] *
会做到的。该-R
标志意味着您要递归搜索当前目录及其所有子目录。该*
是一个文件选择的意义:所有文件。该-c
标志使grep
输出仅出现次数。但是,如果单词在一行上出现多次,则仅计数一次。
来自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.
如果目录中没有符号链接,则没有区别。
-c
标志添加到grep
。然后grep会自我计数,您不需要wc
--
在前面*
*
只扩展到非点文件,让你不错过那些。仅使用“”更有意义。因为您无论如何都要递归处理参数-这将得到点文件。这里更大的问题是,这将可能使行数而不是单词出现的次数。如果该术语多次出现在一行上,则只会由“ grep -c”计数一次
在一个小的python脚本中:
#!/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
。使用以下命令从目录运行它:
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
和f
呢?
root
是文件的路径,包括当前目录“之上”,f
是文件。或者, os.path.join()
可以使用,但是更详细。
n = n + open(f).read().count(s)
呢