回答:
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
、発生回数のみを出力します。ただし、単語が1行に複数回出現する場合は、1回だけカウントされます。
から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
--
前に置きたいかもしれません*
*
あなたはすべてのそれらを逃すようにのみ、非ドットファイルに展開されます。"。"だけを使用する方が理にかなっています。とにかく引数を再帰的に処理するので、ドットファイルが取得されます。ここでのより大きな問題は、これが単語の出現回数ではなく、行数になる可能性があることです。用語が1行に複数回出現する場合、 "grep -c"によって1回だけカウントされます
小さな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)
?