Многие из приведенных ниже решений работают только для одного файла (например foo.c). Любые мысли о количестве строк в проекте (например, много файлов в структуре каталогов, и исключая двоичные файлы)?
разгадывание головоломок
5
@solvingPuzzles Я думаю, что могу ответить на эту часть. Для любого решения, которое работает с одним файлом, например «cat FILE | sed blah», вы можете работать со многими файлами, заменив «cat FILE» командой, в которой перечислены имена файлов, с которыми нужно работать, например, «find. -Name» * .py '", и отправьте это в" xargs cat ". например, "find. -name '* .py' | xargs cat | sed '/ ^ \ s * $ / d' | wc -l"
Джонатан Хартли
2
@JonathanHartley @solvingPuzzles также есть подобные программы, slocи clocони здесь для подсчета количества строк кода.
AsTeR
OP здесь: Когда я впервые задал эту проблему, cloc не очень хорошо справился с Python-кодом. В наше время это здорово.
Джонатан Хартли,
Cloc также доступен в виде модуля npm и экономит много времени.
Не уверен, почему вы используете кошку там. Используйте foo.c или foo.pl в качестве имени файла для передачи в sed. sed '/ ^ \ s * $ / d' foo.c | wc -l
Энди Лестер
28
Просто привычка. Я читаю конвейеры слева направо, что означает, что я обычно начинаю с cat, затем action, action, action и т. Д. Очевидно, конечный результат один и тот же.
Майкл Крамер
32
Чтобы сделать это для всех файлов во всех подпапках и исключить комментарии с помощью «//», расширьте эту команду следующим образом: find. -type f -name '* .c' -exec cat {} \; | sed '/ ^ \ s * # / d; / ^ \ s * $ / d; / ^ \ s * \ / \ // d' | wc -l
Бенджамин Интал
11
Вы можете читать слева направо без UUOC: < foo.pl sed 'stuff' | wc -l.
jw013
22
Вообще говоря, UUOC не важен, но удобочитаемость есть.
Выше приведено общее количество строк кода (пустые строки удалены) для проекта (текущая папка и все подпапки рекурсивно).
В приведенных выше "./blog" "./punbb" "./js/3rdparty" и "./pma" находятся папки, которые я в черном списке, так как я не написал в них код. Также .php, .as, .sql, .css, .js являются расширениями просматриваемых файлов. Любые файлы с другим расширением игнорируются.
Вам нужно добавить $в grep ( ...\.js$|...), иначе он будет совпадать feature.js.swp.
Xeoncross
Вы забыли привязку, поэтому она содержит неправильные файлы. И еще более простая версия с привязкой:find . | egrep '.\.c$|.\.h$' | xargs cat | sed '/^\s*$/d' | wc -l
Mark Jeronimus
36
Если вы хотите использовать что-то кроме сценария оболочки, попробуйте CLOC :
cloc считает пустые строки, строки комментариев и физические строки исходного кода во многих языках программирования. Он полностью написан на Perl без каких-либо зависимостей вне стандартного дистрибутива Perl v5.6 и выше (код из некоторых внешних модулей встроен в cloc) и поэтому довольно переносим.
Когда я впервые задал этот вопрос, 'cloc' считал строки документации Python как строки кода, что было неоптимальным ИМХО. Современные версии 'cloc' теперь считают строки документации Python комментариями, которые мне нравятся гораздо больше.
Джонатан Хартли
Это правильный ответ! Я только что попробовал cloc out, и он хорошо справляется со своей задачей.
LeeMobile
31
Есть много способов сделать это, используя обычные утилиты оболочки.
Мое решение:
grep -cve '^\s*$'<file>
При этом выполняется поиск строк в <file> не совпадающих (-v) строках, которые соответствуют шаблону (-e) '^ \ s * $', который является началом строки, за которой следуют 0 или более пробельных символов, а затем к концу строки (т. е. нет содержимого, отличного от пробела), и отобразите количество совпадающих строк (-c) вместо самих совпадающих строк.
Преимущество этого метода перед методами, которые включают в себя конвейерную передачу wc, состоит в том, что вы можете указать несколько файлов и получить отдельный счетчик для каждого файла:
Спасибо! Между прочим, wc предоставляет счетчик для каждого данного файла плюс итоговое значение.
Джонатан Хартли
1
Не, если вы в нее ввязываетесь, хотя по стандарту считается только один файл.
SpoonMeiser
Это лучший ответ на мой взгляд.
simhumileco
-eне обязательно. Это нормальное позиционное расположение паттерна, и вы не делаете с ним ничего прикольного. Но нет ничего плохого в том, чтобы быть явным, если это твой стиль.
Джектоз
13
'wc' считает строки, слова, символы, поэтому для подсчета всех строк (включая пустые) используйте:
wc *.py
Чтобы отфильтровать пустые строки, вы можете использовать grep:
grep -v '^\s*$'*.py | wc
«-v» указывает grep выводить все строки, кроме тех, которые соответствуют «^» - начало строки. «\ s *» - ноль или более пробельных символов. «$» - конец строки * .py - мой пример для все файлы, которые вы хотите посчитать (все файлы Python в текущем каталоге), выводятся в канал wc. Пошли.
Я отвечаю на свой (настоящий) вопрос. Не удалось найти запись переполнения стека, покрывающую это.
\ W не соответствует пробелу, оно соответствует несловесным символам. Это противоположность \ w, слово символов. \ W Будет соответствовать всему, что не является буквенно-цифровым или подчеркиванием, и, следовательно, не будет делать то, что вы утверждаете здесь. Вы имеете в виду \ s
SpoonMeiser
9
Эта команда подсчитывает количество непустых строк. cat fileName | grep -v ^$ | wc -l grep -v ^ $ функция регулярного выражения игнорирует пустые строки.
Я бы проголосовал за это только потому, что я буквально никогда не видел, чтобы кто-то использовал преинкремент в скрипте awk, но, к сожалению, это учитывает только пустые строки. :) Вы имеете в виду awk '!/^[[:space:]]*$/{++x} END{print x}'. Или, если вы действительно ненавидите негативы awk '{y++} /^[[:space:]]*$/{++x} END{print y-x}'
,;
4
grep -cvE '(^\s*[/*])|(^\s*$)' foo
-c = count
-v = exclude
-E = extended regex
'(comment lines) OR (empty lines)'
where
^= beginning of the line
\s = whitespace
*= any number of previous characters or none
[/*]= either / or *|= OR
$ = end of the line
Я отправляю это, потому что другие варианты дали неправильные ответы для меня. Это работало с моим источником Java, где строки комментариев начинаются с / или * (я использую * в каждой строке в многострочном комментарии).
Это работоспособное решение. Единственное, на что следует обратить внимание: многострочные комментарии не учитываются
Amol
2
Вот скрипт Bash, который считает строки кода в проекте. Он рекурсивно просматривает исходное дерево и исключает пустые строки и однострочные комментарии, которые используют «//».
# $excluded is a regex for paths to exclude from line counting
excluded="spec\|node_modules\|README\|lib\|docs\|csv\|XLS\|json\|png"
countLines(){# $total is the total lines of code counted
total=0# -mindepth exclues the current directory (".")for file in`find . -mindepth 1 -name "*.*" |grep -v "$excluded"`;do# First sed: only count lines of code that are not commented with //# Second sed: don't count blank lines# $numLines is the lines of code
numLines=`cat $file | sed '/\/\//d' | sed '/^\s*$/d' | wc -l`# To exclude only blank lines and count comment lines, uncomment this:#numLines=`cat $file | sed '/^\s*$/d' | wc -l`
total=$(($total + $numLines))
echo " " $numLines $file
done
echo " " $total in total
}
echo Source code files:
countLines
echo Unit tests:
cd spec
countLines
, соответствует пробелу. Это решение работает только в том случае, если вы считаете, что строка, содержащая только пробел, является непустой, что технически так, хотя, вероятно, это не то, что вам нужно.
SpoonMeiser
1
Скрипт для рекурсивного подсчета всех непустых строк с определенным расширением файла в текущем каталоге:
#!/usr/bin/env bash(
echo 0;for ext in"$@";dofor i in $(find .-name "*$ext");do
sed '/^\s*$/d' $i | wc -l ## skip blank lines#cat $i | wc -l; ## count all lines
echo +;donedone
echo p q;)| dc;
\ W - это несимвольные символы; это не будет соответствовать линии, как ${-[*]} + $@, например. Который, безусловно, действительный код где-то в мире. ;) Вы имеете в виду \ s для космоса.
Привет. «wc» сам по себе не ищет подкаталоги и не отфильтровывает пустые строки, оба явно заданы в вопросе.
Джонатан Хартли
wcсчитает пустые строки. ОП хочет подсчитать непустые строки. Это правда, что он захочет использоватьwc , но только после того, как он будет отредактирован потоком с помощьюsed
foo.c
). Любые мысли о количестве строк в проекте (например, много файлов в структуре каталогов, и исключая двоичные файлы)?sloc
иcloc
они здесь для подсчета количества строк кода.Ответы:
И если вы считаете комментарии пустыми строками:
Хотя это зависит от языка.
источник
< foo.pl sed 'stuff' | wc -l
.Выше приведено общее количество строк кода (пустые строки удалены) для проекта (текущая папка и все подпапки рекурсивно).
В приведенных выше "./blog" "./punbb" "./js/3rdparty" и "./pma" находятся папки, которые я в черном списке, так как я не написал в них код. Также .php, .as, .sql, .css, .js являются расширениями просматриваемых файлов. Любые файлы с другим расширением игнорируются.
источник
$
в grep (...\.js$|...
), иначе он будет совпадатьfeature.js.swp
.find . | egrep '.\.c$|.\.h$' | xargs cat | sed '/^\s*$/d' | wc -l
Если вы хотите использовать что-то кроме сценария оболочки, попробуйте CLOC :
источник
Есть много способов сделать это, используя обычные утилиты оболочки.
Мое решение:
При этом выполняется поиск строк в <file> не совпадающих (-v) строках, которые соответствуют шаблону (-e) '^ \ s * $', который является началом строки, за которой следуют 0 или более пробельных символов, а затем к концу строки (т. е. нет содержимого, отличного от пробела), и отобразите количество совпадающих строк (-c) вместо самих совпадающих строк.
Преимущество этого метода перед методами, которые включают в себя конвейерную передачу
wc
, состоит в том, что вы можете указать несколько файлов и получить отдельный счетчик для каждого файла:источник
-e
не обязательно. Это нормальное позиционное расположение паттерна, и вы не делаете с ним ничего прикольного. Но нет ничего плохого в том, чтобы быть явным, если это твой стиль.'wc' считает строки, слова, символы, поэтому для подсчета всех строк (включая пустые) используйте:
Чтобы отфильтровать пустые строки, вы можете использовать grep:
«-v» указывает grep выводить все строки, кроме тех, которые соответствуют «^» - начало строки. «\ s *» - ноль или более пробельных символов. «$» - конец строки * .py - мой пример для все файлы, которые вы хотите посчитать (все файлы Python в текущем каталоге), выводятся в канал wc. Пошли.
Я отвечаю на свой (настоящий) вопрос. Не удалось найти запись переполнения стека, покрывающую это.
источник
Эта команда подсчитывает количество непустых строк.
cat fileName | grep -v ^$ | wc -l
grep -v ^ $ функция регулярного выражения игнорирует пустые строки.
источник
cat
этой цепочке нет необходимости :grep -v ^$ fileName | wl -l
wc -l
потому что у grep-c
:grep -vc ^$ fileName
источник
должен сделать трюк просто отлично
источник
источник
awk '!/^[[:space:]]*$/{++x} END{print x}'
. Или, если вы действительно ненавидите негативыawk '{y++} /^[[:space:]]*$/{++x} END{print y-x}'
Я отправляю это, потому что другие варианты дали неправильные ответы для меня. Это работало с моим источником Java, где строки комментариев начинаются с / или * (я использую * в каждой строке в многострочном комментарии).
источник
Вот скрипт Bash, который считает строки кода в проекте. Он рекурсивно просматривает исходное дерево и исключает пустые строки и однострочные комментарии, которые используют «//».
Вот как выглядит вывод для моего проекта :
Наслаждайтесь! - Курран
источник
Это будет зависеть от количества файлов в вашем проекте. В теории вы могли бы использовать
Где вы можете заполнить список файлов с помощью утилиты поиска.
Даст вам количество строк на файл.
источник
Скрипт для рекурсивного подсчета всех непустых строк с определенным расширением файла в текущем каталоге:
Пример использования:
источник
Если вы хотите получить сумму всех непустых строк для всех файлов с заданным расширением во всем проекте:
Первый аргумент - это базовый каталог проекта, второй - расширение файла. Пример использования:
Это немного больше, чем коллекция предыдущих решений.
источник
дает общее количество для всех файлов в текущем каталоге и его подкаталогах.
НТН!
источник
${-[*]} + $@
, например. Который, безусловно, действительный код где-то в мире. ;) Вы имеете в виду \ s для космоса.Это дает количество строк без учета пустых строк:
источник
дает количество непустых строк в текущем рабочем каталоге.
источник
Для этого в Linux уже есть программа под названием 'wc'.
Просто
и это дает вам общее количество строк и строк для каждого файла.
источник
wc
считает пустые строки. ОП хочет подсчитать непустые строки. Это правда, что он захочет использоватьwc
, но только после того, как он будет отредактирован потоком с помощьюsed