Як би ви порахували кожне виникнення терміна у всіх файлах у поточному каталозі? - і підкаталоги (?)
Я читав, що для цього ви б скористалися grep
; яка точна команда?
Також, чи можливо вищезазначене за допомогою якоїсь іншої команди?
Як би ви порахували кожне виникнення терміна у всіх файлах у поточному каталозі? - і підкаталоги (?)
Я читав, що для цього ви б скористалися grep
; яка точна команда?
Також, чи можливо вищезазначене за допомогою якоїсь іншої команди?
Відповіді:
Використання grep
+ wc
(це вплине на кілька випадків виникнення терміна в одному рядку):
grep -rFo foo | wc -l
-r
в grep
: рекурсивно здійснює пошук у поточній ієрархії каталогів;-F
в grep
: збігається з фіксованим рядком замість візерунка;-o
у grep
: друкує лише сірники;-l
в 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
. Тоді греп рахує себе, і вам не потрібно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)
?