디렉토리에 있는 모든 코드 행을 재귀적으로 계산하려면 어떻게 해야 합니까?
우리는 PHP 애플리케이션을 가지고 있고 특정 디렉터리와 하위 디렉터리 아래의 모든 코드 행을 세고 싶습니다.
저희는 대충 파악하려고 하는 것이기 때문에 댓글을 무시할 필요가 없습니다.
wc -l *.php
이 명령은 지정된 디렉터리에 대해 잘 작동하지만 하위 디렉터리는 무시합니다.다음과 같은 코멘트가 효과가 있을지도 모른다고 생각했는데, 74가 돌아오고 있어요. 절대 그렇지 않아요.
find . -name '*.php' | wc -l
디렉토리에서 모든 파일을 동시에 입력하는 올바른 구문은 무엇입니까?
시도:
find . -name '*.php' | xargs wc -l
또는 (파일 이름에 공백과 같은 특수 문자가 포함된 경우)
find . -name '*.php' | sed 's/.*/"&"/' | xargs wc -l
이것은 당신이 가리키는 계층에 대한 정확한 코드 개수의 소스 라인과 몇 가지 추가 통계를 제공할 것입니다.
정렬된 출력:
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
현재 폴더 또는 해당 하위 폴더 중 하나에 있는 파일 또는 다른 폴더에서 파일을 삭제합니다.
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
'IT' 카테고리의 다른 글
요소 번호가 있는 PostgreSQL unnest() (0) | 2023.05.08 |
---|---|
메이븐 프로젝트를 이클립스로 가져오는 중 (0) | 2023.05.08 |
T-SQL: 새 Excel 파일로 내보내기 (0) | 2023.05.08 |
노드 0.12에 'node-sass'를 다시 설치하시겠습니까? (0) | 2023.05.08 |
로드 시 HTML 페이지를 다른 페이지로 리디렉션하는 방법 (0) | 2023.05.08 |