現在のディレクトリ内のすべてのファイルで、用語の出現をすべてカウントするにはどうすればよいでしょうか? - およびサブディレクトリ(?)
これを行うには を使用すると読みましたがgrep
、正確なコマンドは何ですか?
また、他のコマンドでも上記と同じことは可能ですか?
答え1
grep
+を使用しますwc
(これにより、同じ行に複数の用語が出現する場合に対応します)。
grep -rFo foo | wc -l
-r
ingrep
: 現在のディレクトリ階層を再帰的に検索します。-F
ingrep
: パターンではなく固定文字列に一致します。-o
ingrep
: 一致するものだけを出力します。-l
inwc
: 行数を出力します。
% 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
答え2
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.
ディレクトリ内にシンボリック リンクがない場合、違いはありません。
答え3
小さな 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>
ノート
- 用語にスペースが含まれる場合は引用符を使用します。
- 1 行に複数の出現がある場合でも、用語のすべての出現を再帰的にカウントします。
説明:
# 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)
答え4
@kos の素晴らしい回答のバリエーションとして、カウントを項目別に表示することに興味がある場合は、grep の-c
スイッチを使用して発生回数をカウントできます。
$ grep -rFoc foo
file1:3
dir/file2:3