Как бы вы подсчитали каждое вхождение термина во всех файлах в текущем каталоге?

Вы можете установить xbindkeys-config (который предоставляет фантастический графический интерфейс) (sudo apt-get install xbindkeys-config), запустите xbindkeys-config и поместите ритмбокс в качестве действия, нажмите Get Key, нажмите свою последовательность клавиш, Save & amp; Применить & amp; Выход.

Я лично считаю, что панель управления довольно ненадежна по сравнению с xbindkeys.

1
задан 6 November 2015 в 18:10

3 ответа

grep -Rc [term] * сделает это. Флаг -R означает, что вы хотите рекурсивно искать текущий каталог и все его подкаталоги. [F4] - это селектор файлов, означающий: все файлы. Флаг -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.

Если у вас нет символических ссылок в вашем каталоге , нет разницы.

8
ответ дан 23 May 2018 в 16:01
  • 1
    вы можете добавить флаг -c в grep. Тогда grep подсчитывает себя, и вам не нужен wc – Wayne_Yux 6 November 2015 в 18:29
  • 2
    вы можете поставить -- до * – edward torvalds 6 November 2015 в 19:12
  • 3
    [F1] будет расширяться только до неточечных файлов, поэтому вы пропустите все это. Имеет смысл просто использовать " " так как вы все равно будете обрабатывать аргументы рекурсивно - и это приведет к созданию точечных файлов. Большая проблема здесь заключается в том, что это будет число строк, а не количество вхождений слова. Если термин появляется несколько раз на одной строке, он будет подсчитываться только один раз с помощью команды "grep -c" – dannysauer 6 November 2015 в 19:21

В маленьком скрипте 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>

Примечания

Сохраните его как count_string.py. Он подсчитывает каждое появление терма рекурсивно, также, если несколько вхождений в одну строку.

Объяснение:

# 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)
2
ответ дан 23 May 2018 в 16:01
  • 1
    Парень python ;) +1 – DevRobot 6 November 2015 в 18:34
  • 2
    Кстати, для чего нужны root и f? – DevRobot 6 November 2015 в 19:04
  • 3
    root - это путь к файлу, включающий в себя "выше" текущий каталог, f - это файл. В качестве альтернативы можно использовать os.path.join(), но более подробно. – Jacob Vlijm 6 November 2015 в 19:08
  • 4
    И n = n + open(f).read().count(s)? – DevRobot 6 November 2015 в 19:11
  • 5
    Кажется, это единственный ответ, который считает все вхождения этого термина, как запрошено OP. AFAIK, все решения, использующие grep, будут считать все строки, на которых происходит этот термин, поэтому строка, которая включает термин три раза, будет считаться только одним случаем. – Joe 12 November 2015 в 16:20

Как вариант хорошего ответа @ kos, если вы заинтересованы в детализации подсчетов, вы можете использовать переключатель grep -c для подсчета вхождения:

$ grep -rFoc foo
file1:3
dir/file2:3
2
ответ дан 23 May 2018 в 16:01

Другие вопросы по тегам:

Похожие вопросы: