Jawaban:
Menggunakan grep
+ wc
(ini akan memenuhi beberapa kejadian istilah pada baris yang sama):
grep -rFo foo | wc -l
-r
di grep
: mencari secara rekursif dalam hierarki direktori saat ini;-F
di grep
: cocok dengan string tetap dan bukan terhadap pola;-o
di grep
: hanya mencetak yang cocok;-l
di wc
: mencetak hitungan garis;% 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
tidak boleh digunakan karena mereka eksperimental
-F
mungkin akan lebih cepat.
-F
bukan -P
. Terima kasih atas saran bagus, memperbarui penggunaan -F
, yang memang lebih cocok di sini.
grep -Rc [term] *
akan melakukan itu. Tanda itu -R
berarti Anda ingin secara rekursif mencari direktori saat ini dan semua subdirektori. Ini *
adalah arti pemilih file: semua file. The -c
flag membuat grep
keluaran hanya jumlah kejadian. Namun, jika kata itu muncul beberapa kali dalam satu baris, itu hanya dihitung sekali.
Dari 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.
Jika Anda tidak memiliki tautan simbolis di direktori Anda, tidak ada perbedaan.
-c
bendera ke grep
. Kemudian grep menghitung dengan sendirinya dan Anda tidak perluwc
--
sebelum*
*
akan diperluas ke non-dotfile, jadi Anda melewatkan semua itu. Lebih masuk akal untuk menggunakan "." karena Anda akan memproses argumen secara rekursif - dan itu akan mendapatkan file dot. Masalah yang lebih besar di sini adalah bahwa ini akan bisa jumlah baris, bukan jumlah kemunculan kata. Jika istilah tersebut muncul beberapa kali dalam satu baris, itu hanya akan dihitung sekali oleh "grep -c"
Dalam skrip python kecil:
#!/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
.Jalankan dari direktori dengan perintah:
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
dan f
?
root
adalah path ke file termasuk "di atas" direktori saat ini, f
adalah file. Atau, os.path.join()
bisa digunakan, tetapi lebih verbose.
n = n + open(f).read().count(s)
?