3

Я думаю, что могу сделать это как-то с помощью wc, если бы была рекурсивная опция, но я не уверен. Я хочу получить общее количество слов в файлах в каталоге и его подкаталогах (а не только количество слов в файле).

Обратите внимание, я выполняю это с моим Mac.

Хорошо, я только что попробовал эту команду

find enwiki/ -type f | xargs wc -w > output.txt

Результирующий выходной файл имеет 6425104 строки, что указывает на наличие большого количества файлов. Но общее количество слов в итоге составило всего 381609. Возможно, общее количество слов превысило максимально допустимое в bash? Я не уверен, что это произошло или я использовал wc неправильно.

3 ответа3

11

Используя find найти все файлы, затем объединить их с помощью cat и подсчитать слова в объединенном потоке с помощью wc:

find . -type f -print0 | xargs -0 cat | wc -w

Аргумент -print0 для find необходим, если в именах файлов есть пробелы. Когда -print0 используется с find , флаг -0 должен использоваться с xargs .

3

Если ваш wc имеет --files0-from , вы можете сделать это:

find . -type f -print0 | wc -w --files0-from=-

Объяснение:

Я нашел это решение, сначала прочитав справочную страницу wc(1), чтобы узнать, какие параметры доступны для сканирования нескольких файлов. Я нашел это:

--files0-from=F
       read input from the files specified by NUL-terminated names in file F;
       If F is - then read names from standard input

Благодаря использованию find до этого я знал, что он может генерировать нужный список файлов, и с опцией -print0 выводить файлы в виде списка имен, заканчивающихся на NULL.

Соединение этого привело к команде выше. Команда find ищет в текущем каталоге (.) И во всех подкаталогах обычные файлы (-type f) и выводит их полные пути в стандартный вывод, каждое имя которого сопровождается нулевым символом вместо обычной новой строки (-print0). Этот результат передается по каналу (|) в стандартный ввод wc который читает этот список из указанного файла (--files0-from=), где - означает стандартный ввод и выводит количество слов (-w), найденных в каждом файл сопровождается суммой всех найденных слов.

Если все, что вас интересует, это общий итог, вы можете добавить это к приведенной выше команде.

| tail -1
0

Пытаться:

$ find . -type f -exec wc -w {} \; -print | nawk -f sum -

где sum - это программный файл nawk/gawk/awk, заданный двумя строками ниже, который выполняется для каждой строки, выводимой командой слева от символа канала - то есть '|':

{ s += $1 }
END { print "word sum = ", s }

Примечание: права доступа к файлам имеют значение, поэтому можно получить вывод «Отказано в доступе», в противном случае все файлы, принадлежащие пользователю, выполнившему указанную выше команду поиска, переданному в команду nawk (или gawk, или awk), должны давать меньше искомого вывода любые файлы, для которых пользователь не имеет разрешения на чтение.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .