Я пытался использовать sed для подсчета всех строк на основе определенного расширения.
find -name '*.m' -exec wc -l {} \; | sed ...
Я пытался сделать следующее, как бы я включил sed в эту конкретную строку, чтобы получить итоги.
Я пытался использовать sed для подсчета всех строк на основе определенного расширения.
find -name '*.m' -exec wc -l {} \; | sed ...
Я пытался сделать следующее, как бы я включил sed в эту конкретную строку, чтобы получить итоги.
Вы также можете получить хорошее форматирование от wc с помощью:
wc `find -name '*.m'`
-type f
, чтобы избежать случая совпадения имени каталога: wc $(find -type f -name '*.m')
- person Dennis Williamson; 11.09.2009
Большинство ответов здесь не будут работать для большого количества файлов. Некоторые сломаются, если список имен файлов слишком длинный для одного вызова из командной строки, другие неэффективны, потому что -exec
запускает новый процесс для каждого файла. Я считаю, что надежным и эффективным решением было бы:
find . -type f -name "*.m" -print0 | xargs -0 cat | wc -l
Использование cat
таким образом нормально, так как его выходные данные передаются прямо в wc
, поэтому в памяти одновременно сохраняется только небольшое количество содержимого файлов. Если файлов слишком много для одного вызова cat
, cat
будет вызываться несколько раз, но все выходные данные все равно будут направляться в один процесс wc
.
find . -type f -name '*.m' -exec cat {} + | wc -l
.
- person Stephane Chazelas; 05.09.2016
Вы можете cat
все файлы через один экземпляр wc
получить общее количество строк:
find . -name '*.m' -exec cat {} \; | wc -l
На современных платформах GNU wc и find принимают параметры -print0 и -files0-from, которые можно объединить в команду, которая подсчитывает строки в файлах с общим количеством в конце. Пример:
find . -name '*.c' -type f -print0 | wc -l --files0-from=-
вы также можете использовать sed для подсчета строк вместо wc:
find . -name '*.m' -exec sed -n '$=' {} \;
где '$='
— это «специальная переменная», которая хранит количество строк
РЕДАКТИРОВАТЬ
вы также можете попробовать что-то вроде sloccount
$=
представляет адрес и команду. $
является последней строкой, команда =
является текущим номером строки в сочетании с переключателем -n
, который подавляет распечатку пространства шаблонов. В результате он подсчитывает количество переданных ему строк.
- person potong; 13.12.2011
Хм, решение с cat может быть проблематичным, если у вас много файлов, особенно больших.
Второе решение не дает общего количества, только строки в файле, как я тестировал.
Я предпочитаю что-то вроде этого:
find . -name '*.m' | xargs wc -l | tail -1
Это сделает работу быстро, независимо от того, сколько и насколько больших файлов у вас есть.
sed не является подходящим инструментом для подсчета. Вместо этого используйте awk:
find . -name '*.m' -exec awk '{print NR}' {} +
Использование + вместо \; заставляет find вызывать awk через каждые N найденных файлов (например, с xargs).
Для больших каталогов мы должны использовать:
find . -type f -name '*.m' -exec sed -n '$=' '{}' + 2>/dev/null | awk '{ total+=$1 }END{print total}'
# alternative using awk twice
find . -type f -name '*.m' -exec awk 'END {print NR}' '{}' + 2>/dev/null | awk '{ total+=$1 }END{print total}'