Bash에서 프로젝트에서 공백이 아닌 코드 줄 수를 어떻게 계산합니까?
sloc
및 cloc
그 코드 라인 수를 할 여기가.
Bash에서 프로젝트에서 공백이 아닌 코드 줄 수를 어떻게 계산합니까?
sloc
및 cloc
그 코드 라인 수를 할 여기가.
답변:
cat foo.c | sed '/^\s*$/d' | wc -l
그리고 주석을 빈 줄로 생각하면 :
cat foo.pl | sed '/^\s*#/d;/^\s*$/d' | wc -l
그러나 그것은 언어에 달려 있습니다.
< foo.pl sed 'stuff' | wc -l
.
#!/bin/bash
find . -path './pma' -prune -o -path './blog' -prune -o -path './punbb' -prune -o -path './js/3rdparty' -prune -o -print | egrep '\.php|\.as|\.sql|\.css|\.js' | grep -v '\.svn' | xargs cat | sed '/^\s*$/d' | wc -l
위의 내용은 프로젝트 (현재 폴더와 모든 하위 폴더를 재귀 적으로)에 대한 총 코드 줄 수 (공백 줄 제거)를 제공합니다.
위의 "./blog" "./punbb" "./js/3rdparty"및 "./pma"는 코드를 작성하지 않았기 때문에 블랙리스트에있는 폴더입니다. 또한 .php, .as, .sql, .css, .js는보고있는 파일의 확장자입니다. 확장자가 다른 파일은 무시됩니다.
$
grep ( ...\.js$|...
) 에 a를 추가해야합니다 feature.js.swp
. 그렇지 않으면 일치 합니다.
find . | egrep '.\.c$|.\.h$' | xargs cat | sed '/^\s*$/d' | wc -l
쉘 스크립트가 아닌 다른 것을 사용하려면 CLOC를 시도 하십시오 .
cloc는 많은 프로그래밍 언어에서 빈 줄, 주석 줄 및 소스 코드의 실제 줄을 계산합니다. 그것은 Perl v5.6 이상의 표준 배포판 (외부 모듈의 코드가 cloc에 내장되어 있음) 외부에 의존하지 않고 완전히 Perl로 작성되었으므로 이식성이 뛰어납니다.
공통 쉘 유틸리티를 사용하여이를 수행하는 많은 방법이 있습니다.
내 해결책은 다음과 같습니다.
grep -cve '^\s*$' <file>
이것은 <file>에서 줄과 일치하지 않는 (-v) 줄을 검색합니다. '^ \ s * $'는 줄의 시작 부분이며 그 뒤에 공백 문자가 0 개 이상입니다. 줄 끝까지 (즉, 공백 이외의 내용 없음) 일치하는 줄 대신 일치하는 줄 수 (-c)를 표시합니다.
로 파이핑하는 방법에 비해이 방법의 장점은 wc
여러 파일을 지정하고 각 파일에 대해 별도의 수를 얻을 수 있다는 것입니다.
$ grep -cve '^\s*$' *.hh
config.hh:36
exceptions.hh:48
layer.hh:52
main.hh:39
-e
필요가 없습니다. 그것은 패턴의 정상적인 위치입니다. 그리고 당신은 그것으로 펑키하지 않습니다. 그러나 그것이 당신의 스타일이라면 명백한 것이 잘못은 아닙니다.
'wc'는 줄, 단어, 문자를 계산하므로 모든 줄 (빈 줄 포함)을 계산하려면 다음을 사용하십시오.
wc *.py
빈 줄을 걸러 내려면 grep을 사용할 수 있습니다.
grep -v '^\s*$' *.py | wc
'-v'는 '^'와 일치하는 행을 제외한 모든 행을 출력하도록 grep에 지시합니다. '\ s *'는 0 이상의 공백 문자입니다. '$'는 행의 끝입니다. * .py는 계산하려는 모든 파일 (현재 dir의 모든 python 파일) 파이프 출력을 wc로 보냅니다. 나가.
나는 내 자신의 (정품) 질문에 대답하고 있습니다. 이것을 다루는 stackoverflow 항목을 찾을 수 없습니다.
이 명령은 비 공백 행 수를 계산합니다. cat fileName | grep -v ^$ | wc -l
grep -v ^ $ 정규식 함수는 빈 줄을 무시합니다.
cat
이 체인 에는 필요가 없습니다 :grep -v ^$ fileName | wl -l
wc -l
grep도 가지고 있기 때문에 필요가 없습니다 -c
:grep -vc ^$ fileName
cat 'filename' | grep '[^ ]' | wc -l
트릭을 잘해야합니다.
awk '/^[[:space:]]*$/ {++x} END {print x}' "$testfile"
awk '!/^[[:space:]]*$/{++x} END{print x}'
합니다. 또는, 당신이 정말로 부정적인 것을 싫어한다면 awk '{y++} /^[[:space:]]*$/{++x} END{print y-x}'
;)
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 소스에서 작동했습니다 (여러 줄 주석의 모든 줄에서 *를 사용합니다).
다음은 프로젝트의 코드 줄을 세는 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
내 프로젝트 의 출력 결과는 다음과 같습니다 .
Source code files:
2 ./buildDocs.sh
24 ./countLines.sh
15 ./css/dashboard.css
53 ./data/un_population/provenance/preprocess.js
19 ./index.html
5 ./server/server.js
2 ./server/startServer.sh
24 ./SpecRunner.html
34 ./src/computeLayout.js
60 ./src/configDiff.js
18 ./src/dashboardMirror.js
37 ./src/dashboardScaffold.js
14 ./src/data.js
68 ./src/dummyVis.js
27 ./src/layout.js
28 ./src/links.js
5 ./src/main.js
52 ./src/processActions.js
86 ./src/timeline.js
73 ./src/udc.js
18 ./src/wire.js
664 in total
Unit tests:
230 ./ComputeLayoutSpec.js
134 ./ConfigDiffSpec.js
134 ./ProcessActionsSpec.js
84 ./UDCSpec.js
149 ./WireSpec.js
731 in total
즐겨! - 커란
그것은 프로젝트에있는 파일 수에 달려 있습니다. 이론적으로 당신은 사용할 수 있습니다
grep -c '.' <list of files>
find 유틸리티를 사용하여 파일 목록을 채울 수있는 위치.
grep -c '.' `find -type f`
파일 당 줄 수를 줄 것입니다.
현재 디렉토리에서 특정 파일 확장자를 가진 모든 비 공백 행을 재귀 적으로 계산하는 스크립트 :
#!/usr/bin/env bash
(
echo 0;
for ext in "$@"; do
for i in $(find . -name "*$ext"); do
sed '/^\s*$/d' $i | wc -l ## skip blank lines
#cat $i | wc -l; ## count all lines
echo +;
done
done
echo p q;
) | dc;
샘플 사용법 :
./countlines.sh .py .java .html
프로젝트 전체에서 주어진 파일 확장자의 모든 파일에 대한 모든 비 공백 행의 합계를 원할 경우 :
while read line
do grep -cve '^\s*$' "$line"
done < <(find $1 -name "*.$2" -print) | awk '{s+=$1} END {print s}'
첫 번째 arg는 프로젝트의 기본 디렉토리이고, 두 번째는 파일 확장자입니다. 샘플 사용법 :
./scriptname ~/Dropbox/project/src java
이전 솔루션 모음에 지나지 않습니다.
grep -v '^\W*$' `find -type f` | grep -c '.' > /path/to/lineCountFile.txt
현재 디렉토리 및 해당 서브 디렉토리의 모든 파일에 대한 집계 수를 제공합니다.
HTH!
${-[*]} + $@
예를 들어 같은 줄과 일치하지 않습니다 . 세계 어느 곳에서나 유효한 코드입니다. ;) 당신은 공간을 의미합니다.
리눅스에는 이미 'wc'라는 프로그램이 있습니다.
다만
wc -l *.c
각 파일의 총 줄과 줄을 제공합니다.
wc
빈 줄을 계산합니다. OP는 공백이 아닌 행을 계산하려고합니다. 그가 사용하고 싶은 것은 사실 wc
이지만, 다음 을 사용 하여 스트림을 편집 한 후에 만sed
foo.c
. 프로젝트의 총 줄 수 (예 : 디렉토리 구조의 많은 파일 및 이진 파일 제외)에 대한 생각이 있습니까?