IT

디렉토리에 있는 모든 코드 행을 재귀적으로 계산하려면 어떻게 해야 합니까?

itgroup 2023. 5. 8. 22:06
반응형

디렉토리에 있는 모든 코드 행을 재귀적으로 계산하려면 어떻게 해야 합니까?

우리는 PHP 애플리케이션을 가지고 있고 특정 디렉터리와 하위 디렉터리 아래의 모든 코드 행을 세고 싶습니다.

저희는 대충 파악하려고 하는 것이기 때문에 댓글을 무시할 필요가 없습니다.

wc -l *.php 

이 명령은 지정된 디렉터리에 대해 잘 작동하지만 하위 디렉터리는 무시합니다.다음과 같은 코멘트가 효과가 있을지도 모른다고 생각했는데, 74가 돌아오고 있어요. 절대 그렇지 않아요.

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

디렉토리에서 모든 파일을 동시에 입력하는 올바른 구문은 무엇입니까?

시도:

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

또는 (파일 이름에 공백과 같은 특수 문자가 포함된 경우)

find . -name '*.php' | sed 's/.*/"&"/' | xargs  wc -l

SLOCount 도구도 도움이 될 수 있습니다.

이것은 당신이 가리키는 계층에 대한 정확한 코드 개수의 소스 라인과 몇 가지 추가 통계를 제공할 것입니다.

정렬된 출력:

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

다른 원라이너의 경우:

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

공백이 있는 이름에 대해 작동하며 숫자 하나만 출력합니다.

당신은 이 정확한 목적을 위해 만들어진 유틸리티를 사용할 수 있습니다.각 언어의 행 수와 함께 각 언어의 행 수를 보고합니다. 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
-------------------------------------------------------------------------------

최신 버전의 Bash(또는 ZSH)를 사용하면 훨씬 간단합니다.

wc -l **/*.php

에서는 Bash 쉘에다요구다니합이 합니다.globstar 않은 경우에는 "" " " " " "**. glob-proxy는 재귀적입니다.이 설정을 사용하려면 다음을 수행합니다.

shopt -s globstar

파일 중 합니다.~/.bashrc,~/.bash_profile

시스템에는 유스계시에다는음같있다라는 .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
-------------------------------------------------------------------------------

파일 수 또는 원하는 출력을 지정하지 않았습니다.

이것이 당신이 찾고 있는 것일 수 있습니다.

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

하지만 또 다른 변형 :)

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

이렇게 하면 파일별이 아닌 총합이 표시됩니다.

더하다.나고끝 find효과가 있을 거예요

찾기 사용-exec그리고.awk시작합니다.

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

파일을 (" 스니펫모찾다습니을일이파든은(다▁this"-type f파일 확장명으로 찾으려면 다음을 사용합니다.-name:

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

일반적이고 간단한 예로, 다른 이름 확장자(예: 네이티브)의 파일 수를 계산해야 한다고 가정합니다.

wc $(find . -type f | egrep "\.(h|c|cpp|php|cc)" )

Toki 도구는 디렉토리에 코드에 대한 통계를 표시합니다.토케이는 파일 수, 파일 내의 총 줄 수, 코드, 주석 및 공백을 언어별로 그룹화하여 표시합니다.Toki는 Mac, Linux 및 Windows에서도 사용할 수 있습니다.

토케이의 출력 예는 다음과 같습니다.

$ tokei
-------------------------------------------------------------------------------
 Language            Files        Lines         Code     Comments       Blanks
-------------------------------------------------------------------------------
 CSS                     2           12           12            0            0
 JavaScript              1          435          404            0           31
 JSON                    3          178          178            0            0
 Markdown                1            9            9            0            0
 Rust                   10          408          259           84           65
 TOML                    3           69           41           17           11
 YAML                    1           30           25            0            5
-------------------------------------------------------------------------------
 Total                  21         1141          928          101          112
-------------------------------------------------------------------------------

Toki는 저장소의 README 파일에 있는 지침에 따라 설치할 수 있습니다.

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

디렉터리에 있는 코드 줄을 셀 수 있는 슬로우 카운트라는 작은 도구가 있습니다.

빈 행/주석을 무시하고 프로그래밍 언어별로 결과를 그룹화하며 일부 통계를 계산하므로 원하는 이상의 작업을 수행합니다.

간한것원다니합을단▁a다를 원합니다.for슬롯:슬라이드:

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

소스만 해당:

wc `find`

필터링하려면 grep를 사용합니다.

wc `find | grep .php$`

하여 검색 속도가 빠릅니다.find때오버플로), 를 사용하지 기호가 합니다.xargs불필요하게 많은 외부 명령을 실행하지 않습니다(덕분에).+위해서find-exec여기 있습니다.

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

지금까지 답변 중 공백이 있는 파일 이름 문제에 대한 답은 없습니다.

가로추, 사는모것을 사용하는 xargs트리의 총 경로 길이가 셸 환경 크기 제한(Linux의 경우 기본값은 몇 메가바이트)을 초과하면 실패할 수 있습니다.

여기 이러한 문제를 상당히 직접적으로 해결하는 방법이 있습니다.하위 셸은 공백이 있는 파일을 처리합니다.awk 의 총 입니다.wc공간이 부족해서는 안 됩니다. 또한제을가합다니한▁the다▁restricts합니▁it를 제한합니다.exec파일 전용(디렉토리 포함):

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

질문에 bash로 가 되어 있는 건 알지만, 당신이 해결하려는 문제도 PHP와 관련이 있는 것 같습니다.

Sebastian Bergmann은 여러분이 원하는 것을 하고 프로젝트의 복잡성에 대한 개요를 제공하는 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

보시다시피, 제공된 정보는 프로젝트를 시작하기 전에 프로젝트가 얼마나 복잡한지 대략적으로 알려줄 수 있기 때문에 개발자의 관점에서 훨씬 더 유용합니다.

단순하게 하고 싶다면, 중간자를 잘라내고 그냥 전화하세요.wc모든 파일 이름과 함께:

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

또는 현대 구문에서:

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

이것은 디렉토리 이름 또는 파일 이름에 공백이 없는 한 작동합니다.그리고 수만 개의 파일이 없는 한(현대의 셸은 정말 긴 명령줄을 지원합니다).프로젝트에는 74개의 파일이 있으므로 확장할 수 있는 공간이 충분합니다.

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 of '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트랩(라인이 아닌 입력 가능!!!)

가장 긴 파일을 먼저 배포하고(예: 이러한 긴 파일은 리팩터링이 필요합니까?), 일부 공급업체 디렉토리는 제외합니다.

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

Windows의 경우 쉽고 빠른 도구는 LocMetrics입니다.

다음과 같은 유틸리티를 사용할 수 있습니다.codel(link).이것은 간단한 파이썬 모듈로 화려한 포맷으로 줄을 세어볼 수 있습니다.

설치

pip install codel

사용.

줄를 세는 C++ 파일 사용).cpp그리고..h "/", "/":

codel count -e .cpp .h

.gitignore 형식의 일부 파일/폴더를 무시할 수도 있습니다.

codel count -e .py -i tests/**

면모파무다니시됩에 됩니다.tests/폴더를 누릅니다.

출력은 다음과 같습니다.

긴 출력

▁the▁you▁can로 출력을 할 수도 있습니다.-s플래그. 각 파일의 정보를 숨기고 각 확장자에 대한 정보만 표시합니다.예는 다음과 같습니다.

쇼트 아웃풋

가 정렬되도록 , 줄수따결정면다추다니가합음을을 .| sort또는| sort -r(-r내림차순으로) 첫 번째 답변에 다음과 같이 입력합니다.

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

파일이 너무 많으면 전체 줄 수만 찾는 것이 좋습니다.

find . -name '*.php' | xargs wc -l | grep -i ' total' | awk '{print $1}'

매우 간단하게:

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

다른 점:

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

이것은 잘 해결되지만 적어도 하나는 있어야 합니다.*.php현재 폴더 또는 해당 하위 폴더 중 하나에 있는 파일 또는 다른 폴더에서 파일을 삭제합니다.

Z 셸(zsh) 글러브를 사용하면 매우 쉽습니다.

wc -l ./**/*.php

Bash를 사용하는 경우 업그레이드만 하면 됩니다.Bash를 사용할 이유가 전혀 없습니다.

bash도구는 항상 사용하기 좋지만 이러한 목적을 위해서는 도구를 사용하는 것이 더 효율적인 것 같습니다.저는 2022년 기준으로 클로크(perl), 고클록(go), 피건트(pygount) 등 주요 선수들과 경기를 했습니다.

너무 많이 조정하지 않고 다양한 결과를 얻었습니다.은 가장확정하고엄게빠것같다습니른청나▁seems▁is다▁the같니습입니다.gocloc.

뷰 프런트 엔드가 있는 작은 라벨 프로젝트의 예:

고클록

$ ~/go/bin/gocloc /home/jmeyo/project/sequasa
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
JSON                             5              0              0          16800
Vue                             96           1181            137           8993
JavaScript                      37            999            454           7604
PHP                            228           1493           2622           7290
CSS                              2            157             44            877
Sass                             5             72            426            466
XML                             11              0              2            362
Markdown                         2             45              0            111
YAML                             1              0              0             13
Plain Text                       1              0              0              2
-------------------------------------------------------------------------------
TOTAL                          388           3947           3685          42518
-------------------------------------------------------------------------------

시계의

$ cloc /home/jmeyo/project/sequasa
     450 text files.
     433 unique files.                                          
      40 files ignored.

github.com/AlDanial/cloc v 1.90  T=0.24 s (1709.7 files/s, 211837.9 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
JSON                             5              0              0          16800
Vuejs Component                 95           1181            370           8760
JavaScript                      37            999            371           7687
PHP                            180           1313           2600           5321
Blade                           48            180            187           1804
SVG                             27              0              0           1273
CSS                              2            157             44            877
XML                             12              0              2            522
Sass                             5             72            418            474
Markdown                         2             45              0            111
YAML                             4             11             37             53
-------------------------------------------------------------------------------
SUM:                           417           3958           4029          43682
-------------------------------------------------------------------------------

피그 카운트

$ pygount --format=summary /home/jmeyo/project/sequasa
┏━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━━━┳━━━━━━┓
┃ Language      ┃ Files ┃     % ┃  Code ┃     % ┃ Comment ┃    % ┃
┡━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━━━╇━━━━━━┩
│ JSON          │     5 │   1.0 │ 12760 │  76.0 │       0 │  0.0 │
│ PHP           │   182 │  37.1 │  4052 │  43.8 │    1288 │ 13.9 │
│ JavaScript    │    37 │   7.5 │  3654 │  40.4 │     377 │  4.2 │
│ XML+PHP       │    43 │   8.8 │  1696 │  89.6 │      39 │  2.1 │
│ CSS+Lasso     │     2 │   0.4 │   702 │  65.2 │      44 │  4.1 │
│ SCSS          │     5 │   1.0 │   368 │  38.2 │     419 │ 43.5 │
│ HTML+PHP      │     2 │   0.4 │   171 │  85.5 │       0 │  0.0 │
│ Markdown      │     2 │   0.4 │    86 │  55.1 │       4 │  2.6 │
│ XML           │     1 │   0.2 │    29 │  93.5 │       2 │  6.5 │
│ Text only     │     1 │   0.2 │     2 │ 100.0 │       0 │  0.0 │
│ __unknown__   │   132 │  26.9 │     0 │   0.0 │       0 │  0.0 │
│ __empty__     │     6 │   1.2 │     0 │   0.0 │       0 │  0.0 │
│ __duplicate__ │     6 │   1.2 │     0 │   0.0 │       0 │  0.0 │
│ __binary__    │    67 │  13.6 │     0 │   0.0 │       0 │  0.0 │
├───────────────┼───────┼───────┼───────┼───────┼─────────┼──────┤
│ Sum           │   491 │ 100.0 │ 23520 │  59.7 │    2173 │  5.5 │
└───────────────┴───────┴───────┴───────┴───────┴─────────┴──────┘

결과는 엇갈리고, 현실에 가장 가까운 것은gocloc.

  • cloc: 0m0.1200s
  • gocloc: 0m0.059s
  • pyg 카운트: 0m39.980년대

적어도 OS X의 경우 다른 답변 중 일부에 나열된 find+xarg+wc 명령은 큰 목록에서 "합계"를 여러 번 인쇄하며, 전체 합계는 지정되지 않습니다.다음 명령을 사용하여 .c 파일에 대한 총계를 얻을 수 있었습니다.

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

예를 들어, PHP 파일의 총 줄 수만 필요한 경우, GnuWin32가 설치되어 있으면 Windows에서도 매우 간단한 한 줄 명령을 사용할 수 있습니다.다음과 같이:

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

find.exe가 정확히 어디에 있는지 지정해야 합니다. 그렇지 않으면 Windows에서 FIND를 제공했습니다.EXE는 환경 PATH에서 GnuWin32 이전이고 매개 변수와 결과가 다르기 때문에 (이전 DOS와 유사한 명령에서) 실행됩니다.

위의 명령에서는 따옴표가 아닌 뒤 따옴표를 사용해야 합니다.

언급URL : https://stackoverflow.com/questions/1358540/how-can-i-count-all-the-lines-of-code-in-a-directory-recursively

반응형