현재 디렉터리의 모든 파일에서 특정 용어가 나타날 때마다 어떻게 계산합니까? - 그리고 하위 디렉터리(?)
나는 이것을 하기 위해 당신이 사용할 것을 읽었습니다 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
그러나 해당 단어가 한 줄에 여러 번 나타나는 경우에는 한 번만 계산됩니다.
에서 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>
노트
- 용어에 공백이 포함된 경우 따옴표를 사용하세요.
- 한 줄에 여러 번 나타나는 경우에도 용어의 모든 발생을 재귀적으로 계산합니다.
설명:
# 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