답변:
시험:
find . -name '*.php' | xargs wc -l
SLOCCount 도구도 도움이 될 수 있습니다.
그것은 당신이 가리키는 어떤 계층 구조와 몇 가지 추가 통계에 대한 정확한 소스 코드 줄을 줄 것입니다.
정렬 된 출력 :
find . -name '*.php' | xargs wc -l | sort -nr
find . -name '*.php' -o -name '*.inc' | xargs wc -l
wc
여러 번 실행 되기 때문에 많은 특수 파일 이름을 처리하지 않습니다)
find . -name "*.php" -not -path "./tests*" | xargs wc -l
다른 하나의 라이너 :
( find ./ -name '*.php' -print0 | xargs -0 cat ) | wc -l
공백이있는 이름에서 작동하며 하나의 숫자 만 출력합니다.
man find
.. xargs -0이있는 print0을 사용하면 이름에 공백이나 다른 이상한 문자가있는 파일을 조작 할 수 있습니다.
( find . \( -name '*.h' -o -name '*.cpp' \) -print0 | xargs -0 cat ) | wc -l
최신 버전의 Bash (또는 ZSH)를 사용하는 경우 훨씬 간단합니다.
wc -l **/*.php
Bash 셸에서는 globstar
옵션을 설정 해야하며 , 그렇지 않으면 **
glob 연산자가 재귀 적이 지 않습니다. 이 설정을 사용하려면 발행
shopt -s globstar
이 영구적하려면 초기화 파일 중 하나 (에 추가 ~/.bashrc
, ~/.bash_profile
등).
globstar
를 설정 해야합니다.
wc -l **/*.[ch]
가있는 @PeterSenna 명령 은 총 15195373 줄을 찾습니다. "매우 낮은 값"으로 간주하는지 확실하지 않습니다. 다시, globstar
Bash에서 활성화 했는지 확인해야합니다 . 로 확인할 수 있습니다 shopt globstar
. 명시 적으로 활성화하려면을 수행하십시오 shopt -s globstar
.
ARG_MAX
수가 많은 경우 여전히 오버플로 됩니다 . .php
wc
find
공백이 있으면 허용 된 답변이 실패 합니다. 즉 사용하여 고정 할 수 print0
및 --null
로 find
와 xargs
각각 전화.
cloc
이 정확한 목적으로 만들어진 유틸리티를 사용할 수 있습니다 . CLOC는 Linux, Mac 및 Windows에서 사용 가능합니다. 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
-------------------------------------------------------------------------------
cloc
Perl 스크립트 일 뿐이므로 크로스 플랫폼 임을 분명히 하시겠습니까?
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
-------------------------------------------------------------------------------
파일 수 또는 원하는 출력을 지정하지 않았습니다. 이것이 당신이 찾고있는 것입니까?
find . -name '*.php' | xargs wc -l
go () { mkdir /tmp/go; [[ -f ./"$1" ]] && mv ./"$1" /tmp/go; (find ./ -type f -name "$*" -print0 | xargs -0 cat ) | wc -l; wc -l /tmp/go/*; mv /tmp/go/* . }
결과가 slocount에 가깝지만 *.py
알지 못했습니다.*.js
, *.html
.
또 다른 변형 :)
$ find . -name '*.php' | xargs cat | wc -l
편집 : 파일 단위 대신 총 합계를 제공합니다.
Edit2 : 작동하도록 추가 .
후find
$ find -name \*\.php -print0 | xargs -0 cat | wc -l
find . -name '*.php' | xargs cat | wc -l
... 이것은 파일 별과 총계를 준다 :find . -name '*.php' | xargs wc -l
놀랍게도 find -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; }'
find . -name '*.c' -print0 |xargs -0 wc -l
. 즉,이 더 빠른 방법 (적어도 OS X에서)은 여러 번 "총"인쇄를 끝내므로 적절한 총계를 얻으려면 추가 필터링이 필요합니다 (자세한 내용은 답변에 게시).
wc
의 양식은 cat
먼저 시스템 (jsons의 2백기가바이트, 12K 파일로 테스트) 라인을 세기 시작하는 모든 GB를 처리해야하기 때문에 느립니다. 하고 wc
그 결과를 계산 첫번째 것은 훨씬 빠릅니다
find . -type f -exec wc -l {} \+
또는 find . -name '*.py' -type f -exec wc -l {} \+
출력의 끝에 합계를 인쇄합니다. 관심있는 모든 것이 합계라면 조금 더 나아가서 다음을 사용할 수 있습니다 tail
. find . -type f -exec wc -l {} \+ | tail -1
또는find . -name '*.py' -type f -exec wc -l {} \+ | tail -1
나보다 더 일반적이고 간단합니다. 다른 이름 확장자 (예 : 네이티브)의 파일을 계산해야한다고 가정하십시오.
wc $(find . -type f | egrep "\.(h|c|cpp|php|cc)" )
의견을 보내 주셔서 감사합니다. 수정했습니다.
$()
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
디렉토리에서 코드 줄을 세는 sloccount 라는 작은 도구가 있습니다 . 빈 줄 / 주석을 무시하고 프로그래밍 언어별로 결과를 그룹화하고 일부 통계를 계산하므로 원하는 것보다 더 많이 수행해야합니다.
원하는 것은 간단한 for
루프입니다.
total_count=0
for file in $(find . -name *.php -print)
do
count=$(wc -l $file)
let total_count+=count
done
echo "$total_count"
xargs
않습니까?
IFS=$'\n'
루프 전에 설정하면 이름에 줄 바꿈이있는 파일을 제외한 모든 파일에 대해 적어도 루프를 수정합니다. 둘째, 인용하지 않으므로 '*.php'
셸이 확장하지 않고 find
ergo는 실제로 하위 디렉토리에서 PHP 파일을 찾지 않습니다. 또한 -print
다른 작업이 없기 때문에 암시 적입니다.
소스에만 해당 :
wc `find`
필터링하려면 grep을 사용하십시오.
wc `find | grep .php$`
find
너무 빠른 파일은 너무 많은 파일 (번호 인수 오버플로)이있을 때 실패하지 않고 의 모든 검색 / 필터링 기능을 사용하며 이름에 재미있는 기호가있는 파일을 사용하지 않고 잘 작동합니다 xargs
. 외부 명령의 쓸데없이 많은 수의 (덕분 +
에 find
의 -exec
). 여기 있습니다 :
find . -name '*.php' -type f -exec cat -- {} + | wc -l
\;
대신 이 변형을 게시하려고 +
했지만이 답변이 정답이어야합니다.
질문에 태그가 붙어 있음을 알고 있습니다 세게 때리다하지만 해결하려는 문제는 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
보시다시피 제공된 정보는 프로젝트를 시작하기 전에 프로젝트가 얼마나 복잡한지를 대략적으로 알 수 있기 때문에 개발자의 관점에서 훨씬 유용합니다.
아무도 묻지 않을 것 같아요 ... 지금까지 답은 공백이있는 파일 이름 문제에 대해서는 얻지 못했습니다. 또한 xargs
트리의 전체 경로 길이가 셸 환경 크기 제한 (Linux의 경우 기본적으로 몇 메가 바이트)을 초과하면 모든 사용 에 실패 할 수 있습니다. 다음은 이러한 문제를 직접적으로 수정하는 방법입니다. 서브 쉘은 공백이있는 파일을 처리합니다. awk
개별 파일 wc
출력 의 총계 이므로 공간이 부족하지 않아야합니다. 또한 exec
파일 만 제한합니다 (디렉토리 생략).
find . -type f -name '*.php' -exec bash -c 'wc -l "$0"' {} \; | awk '{s+=$1} END {print s}'
화장실 -L? 더 나은 GREP -C ^ 사용
화장실 -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 트랩을 조심하십시오 (줄이 아니라 숫자가 들어갑니다!)
find -type f -name '*.php' -print0 | xargs -0 grep -ch ^ | paste -sd+ - | bc
대안 여기를 참조하십시오 bc
: stackoverflow.com/q/926069/2400328
아주 간단히
find /path -type f -name "*.php" | while read FILE
do
count=$(wc -l < $FILE)
echo "$FILE has $count lines"
done
결과를 줄 수별로 정렬 하려면 첫 번째 답변 에 | sort
또는 | sort -r
( -r
내림차순)을 다음과 같이 추가하면됩니다.
find . -name '*.php' | xargs wc -l | sort -r
xargs wc -l
숫자입니다, 하나는 실제로 사용해야합니다 sort -n
또는 sort -nr
.
들어 윈도우 , 쉽고 빠른 도구입니다 LocMetrics .
Linux를 사용하고 있다면 내가 사용하는 툴 polyglot을 추천한다 . 그것은보다 빠른 극적입니다 중 하나 sloccount
또는 cloc
그것보다 더 풍부한 기능입니다 sloccount
.
당신은 그것을 호출 할 수 있습니다
poly .
또는
poly
따라서 복잡한 bash 스크립트보다 훨씬 사용자 친화적입니다.
도구 토 케이 는 코드에 대한 통계를 디렉토리에 표시합니다. Tokei는 파일 수, 해당 파일 및 코드 내의 총 줄 수, 주석 및 언어별로 그룹화 된 공백을 표시합니다. Tokei는 Mac, Linux 및 Windows에서도 사용할 수 있습니다.
Tokei의 출력 예는 다음과 같습니다.
$ 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
-------------------------------------------------------------------------------
리포지토리의 README 파일에있는 지침에 따라 Tokei를 설치할 수 있습니다 .
PHP 파일에 총 줄 수만 필요하다면 GnuWin32가 설치되어 있으면 Windows에서도 매우 간단한 한 줄 명령을 사용할 수 있습니다. 이처럼 :
cat `/gnuwin32/bin/find.exe . -name *.php` | wc -l
find.exe의 위치를 정확히 지정해야합니다. 그렇지 않으면 Windows가 제공 한 FIND.EXE (이전 DOS와 같은 명령에서 실행)가 실행됩니다. 환경 PATH의 GnuWin32 이전에있을 수 있기 때문에 매개 변수와 결과가 다릅니다.
위의 명령에서 작은 따옴표가 아닌 큰 따옴표를 사용해야합니다.
간단하게 유지하려면 중개인을 잘라 내고 wc
모든 파일 이름으로 전화 하십시오.
wc -l `find . -name "*.php"`
또는 현대 구문에서 :
wc -l $(find . -name "*.php")
디렉토리 이름이나 파일 이름에 공백이없는 한 작동합니다. 그리고 수만 개의 파일이없는 한 (현대 쉘은 실제로 긴 명령 행을 지원합니다). 프로젝트에 74 개의 파일이 있으므로 확장 할 공간이 충분합니다.
wc -l `find . -type f \( -name "*.cpp" -o -name "*.c" -o -name "*.h" \) -print`
복잡하고 기억하기 어려운 명령이 모두 필요한 것은 아닙니다. 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입니다.