it-swarm.com.ru

Как посчитать все строки кода в каталоге рекурсивно?

У нас есть приложение PHP, и мы хотим подсчитать все строки кода в определенном каталоге и его подкаталогах. Нам не нужно игнорировать комментарии, так как мы просто пытаемся получить грубое представление. 

wc -l *.php 

Эта команда прекрасно работает в данном каталоге, но игнорирует подкаталоги. Я думал, что это может сработать, но возвращается 74, что, безусловно, не так ...

find . -name '*.php' | wc -l

Какой правильный синтаксис для подачи во всех файлах? 

1384
user77413

Пытаться:

find . -name '*.php' | xargs wc -l

Инструмент SLOCCount также может помочь.

Он даст точные исходные строки кода для любой иерархии На которую вы указываете, а также некоторые дополнительные характеристики.

2340
Peter Elespuru

Для другого однострочника:

( find ./ -name '*.php' -print0 | xargs -0 cat ) | wc -l

работает с именами с пробелами, выводит только одно число.

420
Shizzmo

Если вы используете довольно свежую версию Bash (или ZSH), это намного проще:

wc -l **/*.php

В Bash Shell это требует установки опции globstar, в противном случае оператор ** glob не является рекурсивным. Чтобы включить этот параметр, выполните команду

shopt -s globstar

Чтобы сделать это постоянным, добавьте его в один из файлов инициализации (~/.bashrc, ~/.bash_profile и т.д.).

363
Michael Wild

Вы можете использовать утилиту cloc , которая создана именно для этой цели. Он сообщает каждому количество строк на каждом языке, а также количество комментариев и т.д. CLOC доступен в Linux, Mac и Windows.

Пример использования и вывода:

$ cloc --exclude-lang=DTD,Lua,make,Python .
    2570 text files.
    2200 unique files.                                          
    8654 files ignored.

http://cloc.sourceforge.net v 1.53  T=8.0 s (202.4 files/s, 99198.6 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Javascript                    1506          77848         212000         366495
CSS                             56           9671          20147          87695
HTML                            51           1409            151           7480
XML                              6           3088           1383           6222
-------------------------------------------------------------------------------
SUM:                          1619          92016         233681         467892
-------------------------------------------------------------------------------
264
simao

В UNIX-подобных системах есть инструмент под названием cloc, который предоставляет статистику кода. 

Я наткнулся на случайный каталог в нашей кодовой базе:

      59 text files.
      56 unique files.                              
       5 files ignored.

http://cloc.sourceforge.net v 1.53  T=0.5 s (108.0 files/s, 50180.0 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
C                               36           3060           1431          16359
C/C++ Header                    16            689            393           3032
make                             1             17              9             54
Teamcenter def                   1             10              0             36
-------------------------------------------------------------------------------
SUM:                            54           3776           1833          19481
-------------------------------------------------------------------------------
91
Calmarius

Вы не указали, сколько файлов там или какой желаемый результат .. Это то, что вы ищете:

find . -name '*.php' | xargs wc -l
32
Paweł Polewicz

Еще один вариант :)

$ find -name '*.php' | xargs cat | wc -l

Правка: это даст общую сумму, а не файл за файлом.

21
Motiejus Jakštys

POSIX

В отличие от большинства других ответов здесь, они работают в любой системе POSIX, для любого количества файлов и с любыми именами файлов (кроме отмеченных).


Строки в каждом файле:

find . -name '*.php' -type f -exec wc -l {} \;
# faster, but includes total at end if there are multiple files
find . -name '*.php' -type f -exec wc -l {} +

Строки в каждом файле, отсортированные по пути к файлу

find . -name '*.php' -type f | sort | xargs -L1 wc -l
# for files with spaces or newlines, use the non-standard sort -z
find . -name '*.php' -type f -print0 | sort -z | xargs -0 -L1 wc -l

Строки в каждом файле, отсортированные по убыванию

find . -name '*.php' -type f -exec wc -l {} \; | sort -nr
# faster, but includes total at end if there are multiple files
find . -name '*.php' -type f -exec wc -l {} + | sort -nr

Всего строк во всех файлах

find . -name '*.php' -type f -exec cat {} + | wc -l
20
Paul Draper

Более распространенный и простой, как для меня, предположим, что вам нужно считать файлы с разными расширениями имен (скажем, также нативные)

wc `find . -name '*.[h|c|cpp|php|cc]'`
18
sergeych

Существует небольшой инструмент под названием sloccount для подсчета строк кода в каталоге. Следует отметить, что он делает больше, чем вы хотите, так как он игнорирует пустые строки/комментарии, группирует результаты по языкам программирования и вычисляет некоторую статистику.

17
sebasgo

Удивительно, но нет ответа на основании -exec и awk поиска. Вот так:

find . -type f -exec wc -l {} \; | awk '{ SUM += $0} END { print SUM }'

Этот фрагмент находит все файлы (-type f). Чтобы найти по расширению файла, используйте -name:

find . -name *.py -exec wc -l {} \; | awk '{ SUM += $0} END { print SUM }'
16
jonhattan

только для источников:

wc `find`

для фильтрации, просто используйте grep

wc `find | grep .php$`
11
kekszumquadrat

Простой, который будет быстрым, будет использовать все возможности поиска/фильтрации find, не подведет, когда слишком много файлов (переполнение аргументов чисел), отлично работает с файлами со смешными символами в имени, без использования xargs, не будет запускать бесполезно большое количество внешних команд (спасибо + за find's -exec). Ну вот:

find . -name '*.php' -type f -exec cat -- {} + | wc -l
11
gniourf_gniourf

То, что вы хотите, это простой for цикл:

total_count=0
for file in $(find . -name *.php -print)
do
    count=$(wc -l $file)
    let total_count+=count
done
echo "$total_count"
11
ennuikiller

Полагаю, никто никогда не увидит, что это похоронено сзади ... И все же ни один из ответов до сих пор не касается проблемы имен файлов с пробелами. Кроме того, все, которые используют xargs, могут потерпеть неудачу, если общая длина путей в дереве превышает ограничение размера среды Shell (по умолчанию в Linux несколько мегабайт). Вот тот, который решает эти проблемы довольно прямо. Подоболочка заботится о файлах с пробелами. awk суммирует поток отдельных выходных файлов wc, поэтому никогда не должно заканчиваться свободное место. Он также ограничивает exec только для файлов (пропуская каталоги):

find . -type f -name '*.php' -exec bash -c 'wc -l "$0"' {} \; | awk '{s+=$1} END {print s}' 
8
Gene

Я знаю, что вопрос помечен как bash , но похоже, что проблема, которую вы пытаетесь решить, также связана PHP.

Себастьян Бергманн написал инструмент под названием PHPLOC , который делает то, что вы хотите, и, кроме того, предоставляет вам обзор сложности проекта. Вот пример его отчета:

Size
  Lines of Code (LOC)                            29047
  Comment Lines of Code (CLOC)                   14022 (48.27%)
  Non-Comment Lines of Code (NCLOC)              15025 (51.73%)
  Logical Lines of Code (LLOC)                    3484 (11.99%)
    Classes                                       3314 (95.12%)
      Average Class Length                          29
      Average Method Length                          4
    Functions                                      153 (4.39%)
      Average Function Length                        1
    Not in classes or functions                     17 (0.49%)

Complexity
  Cyclomatic Complexity / LLOC                    0.51
  Cyclomatic Complexity / Number of Methods       3.37

Как видите, предоставленная информация намного полезнее с точки зрения разработчика, поскольку она может примерно сказать вам, насколько сложен проект, прежде чем вы начнете с ним работать.

7
Ja͢ck

WC -L? лучше использовать GREP -C ^

wc -l? Неправильно! Команда wc считает коды новых строк, не строк! Когда последняя строка в файле не заканчивается кодом новой строки, это не засчитывается!

если вы все еще хотите считать строки, используйте grep -c ^ , полный пример:

#this example prints line count for all found files
total=0
find /path -type f -name "*.php" | while read FILE; do
     #you see use grep instead wc ! for properly counting
     count=$(grep -c ^ < "$FILE")
     echo "$FILE has $count lines"
     let total=total+count #in bash, you can convert this for another Shell
done
echo TOTAL LINES COUNTED:  $total

наконец, следите за ловушкой wc -l (считает количество, а не количество строк !!!)

5
Znik

С zsh globs это очень просто:

wc -l ./**/*.php

Если вы используете Bash, вам просто нужно обновить. Нет абсолютно никакой причины использовать bash.

4
HappyFace

Если вы хотите, чтобы результаты сортировались по количеству строк, вы можете просто добавить | sort или | sort -r (-r в порядке убывания) к первому ответу, например так:

find . -name '*.php' | xargs wc -l | sort -r
4
Paul Pettengill

Что-то другое:

wc -l `tree -if --noreport | grep -e'\.php$'`

Это работает нормально, но вам нужно иметь хотя бы один файл *.php в текущей папке или в одной из ее подпапок, иначе wc останавливается

4
nav

Если вам нужно только общее количество строк в, скажем, ваших PHP файлах, вы можете использовать очень простую однострочную команду даже под Windows, если у вас установлен GnuWin32. Как это:

cat `/gnuwin32/bin/find.exe . -name *.php` | wc -l

Вам нужно указать, где именно находится find.exe, иначе будет предоставлен Windows FIND.EXE (из старых DOS-подобных команд), так как он, вероятно, перед GnuWin32 в среде PATH и имеет другие параметры и результаты.

Обратите внимание, что в приведенной выше команде вы должны использовать обратные кавычки, а не одинарные.

3
Neven Boyanov

Сначала выдает самые длинные файлы (т. Е. Может быть, эти длинные файлы нуждаются в некотором рефакторинге?), За исключением некоторых каталогов поставщиков:

 find . -name '*.php' | xargs wc -l | sort -nr | egrep -v "libs|tmp|tests|vendor" | less
3
Matt

Для Windows простым и быстрым инструментом является LocMetrics.

3
walv

в то время как мне нравятся сценарии, я предпочитаю этот, так как он также показывает сводку по каждому файлу, пока общая

wc -l `find . -name "*.php"`
2
akiva

Исключая пустую строку 

find . -name "*.php" | xargs grep -v -c '^$' | awk 'BEGIN {FS=":"} { $cnt = $cnt + $2} END {print $cnt}'

Включая пустые строки:

find . -name "*.php" | xargs wc -l
2
Vladimir Venediktov

Вам не нужны все эти сложные и трудно запоминающиеся команды. Вам просто нужен инструмент с именем line-counter.

Краткий обзор

Вот как вы получаете инструмент

$ pip install line-counter

Используйте команду line, чтобы получить количество файлов и количество строк в текущем каталоге (рекурсивно)

$ line
Search in /Users/Morgan/Documents/Example/
file count: 4
line count: 839

Если вы хотите больше подробностей, просто используйте line -d.

$ line -d
Search in /Users/Morgan/Documents/Example/
Dir A/file C.c                                             72
Dir A/file D.py                                           268
file A.py                                                 467
file B.c                                                   32
file count: 4
line count: 839

И лучшая часть этого инструмента - вы можете добавить к нему .gitignore, например, файл конфигурации. Вы можете настроить правила, чтобы выбирать или игнорировать, какие типы файлов считать так же, как в «.gitignore».

Более подробное описание и использование здесь: https://github.com/MorganZhang100/line-counter

2
Morgan Zhang

По крайней мере, в OS X команды find + xarg + wc, перечисленные в некоторых других ответах, печатают «total» несколько раз в больших списках, и полная сумма не указывается. Мне удалось получить единый итог для файлов .c с помощью следующей команды:

find . -name '*.c' -print0 |xargs -0 wc -l|grep -v total|awk '{ sum += $1; } END { print "SUM: " sum; }'

2
Doug Richardson

Если вы хотите сохранить простоту, вырежьте посредника и просто вызовите wc со всеми именами файлов:

wc -l `find . -name "*.php"`

Или в современном синтаксисе:

wc -l $(find . -name "*.php")

Работает, пока нет пробелов ни в одном из имен каталогов или имен файлов. И до тех пор, пока у вас нет десятков тысяч файлов (современные оболочки поддерживают очень длинные командные строки). В вашем проекте 74 файла, поэтому у вас есть много возможностей для роста.

2
alexis

Если вы работаете в Linux (и я так понимаю), я рекомендую мой инструмент polyglot . Он значительно быстрее, чем sloccount или cloc, и он более функциональный, чем sloccount

Вы можете вызвать его с

poly .

или же

poly

так что это намного удобнее для пользователя, чем какой-то замысловатый скрипт bash.

2
user8174234

Я использовал этот встроенный скрипт, который я запускаю из каталога src-project:

 for i in $(find . -type f); do rowline=$(wc -l $i | cut -f1 -d" "); file=$(wc -l $i | cut -f2 -d" "); lines=$((lines + rowline)); echo "Lines["$lines"] " $file "has "$rowline"rows."; done && unset lines

Это производит этот вывод:

Lines[75]  ./Db.h has 75rows.
Lines[143]  ./Db.cpp has 68rows.
Lines[170]  ./main.cpp has 27rows.
Lines[294]  ./Sqlite.cpp has 124rows.
Lines[349]  ./Sqlite.h has 55rows.
Lines[445]  ./Table.cpp has 96rows.
Lines[480]  ./DbError.cpp has 35rows.
Lines[521]  ./DbError.h has 41rows.
Lines[627]  ./QueryResult.cpp has 106rows.
Lines[717]  ./QueryResult.h has 90rows.
Lines[828]  ./Table.h has 111rows.
2
Luca Davanzo

Я хотел проверить несколько типов файлов, и мне было лениво вычислять сумму вручную. Поэтому я использую это сейчас, чтобы получить общее количество за один раз.

find . -name '*.js' -or -name '*.php' | xargs wc -l | grep 'total'  | awk '{ SUM += $1; print $1} END { print "Total text lines in PHP and JS",SUM }'

79351
15318
Всего строк текста в PHP и JS 94669

Это позволяет вам связывать несколько типов расширений, по которым вы хотите фильтровать. Просто добавьте их в часть -name '*.js' -or -name '*.php' и, возможно, измените сообщение по своему вкусу.

1
Tschallacka

сначала измените каталог, в который вы хотите узнать количество строк. например, если я хочу знать количество строк во всех файлах каталога с именем sample. дать $cd sample. затем попробуйте команду $wc -l *, которая вернет количество строк для каждого файла, а также общее количество строк во всем каталоге в конце

1
venky513

Еще одна команда для получения суммы всех файлов (Linux, конечно)

find ./ -type f -exec wc -l {}  \; | cut -d' ' -f1 | paste -sd+ | bc

Основное отличие от других ответов: 

  1. используя find -exec
  2. используя паста (с разрезом)
  3. используя bc  
1
AJed
$cd directory
$wc -l* | sort -nr
1
sree

очень просто

find /path -type f -name "*.php" | while read FILE
do
    count=$(wc -l < $FILE)
    echo "$FILE has $count lines"
done
1
ghostdog74

Я имею занятую коробку установленную в моей системе Windows. Итак, вот что я сделал.

ECHO OFF
for /r %%G in (*.php) do (
busybox grep . "%%G" | busybox wc -l
) 
1
shyam

Я делаю это так:

вот реализация файла lineCount.c:

#include <stdio.h>
#include <string.h>
#include <stdlib.h> 

int getLinesFromFile(const char*);

int main(int argc, char* argv[]) {
   int total_lines = 0; 
   for(int i = 1; i < argc; ++i) {
       total_lines += getLinesFromFile(argv[i]); // *argv is a char*        
   }    

   printf("You have a total of %d lines in all your file(s)\n",    total_lines);
   return 0;
}


int getLinesFromFile(const char* file_name) {
    int lines = 0;
    FILE* file;
    file = fopen(file_name, "r");
    char c = ' ';
    while((c=getc(file)) != EOF) if(c == '\n') ++lines;
    fclose(file);   
    return lines;
}

Теперь откройте командную строку:

и введите gcc lineCount.c, затем введите ./a.out *.txt Это отобразит общее количество строк файлов, заканчивающихся на .txt в вашем каталоге.

1
Moshe Rabaev

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

find . -name '*.php' | xargs wc -l | grep -i ' total' | awk '{print $1}'
0
bharath
cat \`find . -name "*.php"\` | wc -l
0
Bjarni Herjolfsson

Я также могу добавить еще одну запись OS X, в которой используется простая старая находка с exec (которую я предпочитаю использовать xargs, поскольку в прошлом я видел странные результаты из очень больших наборов результатов find с xargs). Поскольку это для OS X, я также добавил в фильтрацию к файлам .h или .m - убедитесь, что скопировали все до конца! 

find ./ -type f -name "*.[mh]" -exec wc -l {}  \; | sed -e 's/[ ]*//g' | cut -d"." -f1 | paste -sd+ - | bc
0
Kendall Helmstetter Gelner