2

Я использую find для поиска по всем подкаталогам и текущей директории, чтобы найти все .py файлы, а затем запускаю wc -l, чтобы найти количество строк. Однако, когда я использую find с wc, поле Total не отображается, в отличие от того, когда я запускаю wc сам по себе. Кто-нибудь знает, почему это происходит?

find . -name \*.py -exec wc -l {} \;
  187 ./check.py
   43 ./file.py
   33 ./mitch.py
       ...
 1014 ./serve.py
   41 ./test_scripts/line_graph.py
   39 ./welcome.py

Но не итог, но когда я запускаю wc -l *.py в каталоге, я получаю итог:

wc -l *.py
 187 check.py
  43 file.py
  94 log_com.py
 154 log_results.py
  33 mitch.py
1014 serve.py
  39 welcome.py
1564 total

2 ответа2

1

wc выводит значение Total только тогда, когда оно вызывается с несколькими файлами в качестве аргументов.

Из руководства GNU:

Если указано более одного файла, wc печатает последнюю строку, содержащую совокупное количество, с total именем файла.

В вашем случае вы не можете получить итоговый вывод, так как вы вызываете wc один раз для каждого найденного файла, поэтому каждый последующий вызов wc не знает о предыдущем.


Если вам все еще нужно общее количество, вы можете использовать опцию globstar в Bash, чтобы перейти в каталоги и перечислить файлы .py :

shopt -s globstar
wc -l **/*.py

Или, как предполагает grawity, с опцией GNU find 's -exec command {} + , чтобы find замену всех найденных путей в {} , вместо того, чтобы вызывать каждый из них в отдельности (хотя существует ограничение на количество файлов, которые он может заменить так же, как с глобальным подходом).

1

Нет total поля, потому что есть только один файл.

С -exec command {} ; действие, команда find выполняет один раз для каждого файла, при этом каждый раз добавляется только один аргумент. Таким образом, нет ничего, из чего каждый вызов wc мог бы вычислить сумму.

Вам придется использовать -exec command {} + если у вас есть GNU find ; в противном случае вам нужно будет передать список файлов в xargs command .

(В этом ответе я не собираюсь возиться с обычным предложением -print0 , потому что если у вас нет GNU find, у вас не будет ни -print0 ни даже GNU xargs). Однако, если ваша версия xargs не поддерживает -d '\n' используйте это, потому что путь по умолчанию xargs на разбирает вход не очень безопасно.)

Обратите внимание, что это может привести к нескольким wc , потому что большинство операционных систем (за исключением, может быть, Hurd) имеют ограничение на максимальную длину командной строки и / или максимальное количество аргументов для одной команды, которое может превышать большое количество файлов. , Предложение @ slhck об использовании **/*.py также достигнет того же предела (ранние Unix, имеющие очень низкие пределы, - это то, почему xargs был создан в первую очередь).

Другой вариант - использовать awk для окончательного расчета:

find ... | awk '$2 != "total" {sum += $1; print}
                END {printf "%7d total\n", sum}'

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