코드 라인을 세고 있습니까?


24

코드 줄을 세고 싶다면 사소한 것은

cat *.c *.h | wc -l

그러나 하위 디렉토리가 여러 개인 경우 어떻게해야합니까?



3
주 제외 : 왜 불필요한가 cat? wc -l *.c *.h같은 일을합니다.
Thomas Padron-McCarthy 2016

5
@ ThomasPadron-McCarthy 아닙니다. wc -l *.c *.h | tail -n 1비슷한 결과 가 필요 합니다.
Gilles 'SO- 악마 그만'

2
일부 (아마도 대부분의) 현대 쉘 (Bash v4, Zsh 등)은를 사용하여 재귀 글로브 메커니즘을 제공 **하므로 사용 wc -l **/*.{h,c}하거나 비슷한 것을 사용할 수 있습니다 . Bash에서는이 옵션 ( globstar)이 기본적으로 해제 되어 있습니다. 그러나이 특별한 경우 cloc또는 SLOCCount훨씬 더 나은 옵션입니다. (또한 소스 파일을 쉽게 찾고 나열 ack하는 것보다 선호 될 수 있습니다 find.)
Kyle Strand

5
wc -l은 코드 줄이 아니라 줄을 계산합니다. 7000 개의 빈 줄은 여전히 ​​wc -l에 표시되지만 코드 메트릭에는 포함되지 않습니다. (의견은 너무 세지 않습니다)
coteyr

답변:


49

가장 쉬운 방법은이라는 도구를 사용하는 것 cloc입니다. 이 방법으로 사용하십시오 :

cloc .

그게 다야. :-)


1
-1이 프로그램은 지루하지 않은 두뇌 외의 언어로 된 코드 줄을 인식 할 수있는 방법이 없기 때문입니다. Ada와 Pascal, C와 C ++, Java, JavaScript 및 "엔터프라이즈"유형 언어에 대해서는 알고 있지만 파일 확장자만으로 SLOC를 계산하지 않기 때문에 DSL이나 전혀 모르는 언어에는 전혀 쓸모가 없습니다. 약.
고양이

21
@cat 완벽한 것은 없으며 과거와 미래의 모든 요구를 충족시킬 수있는 것은 없습니다.
Ho1

2
글쎄, CLOC가 인정하지 않는 프로그래밍 언어는 실제로 나의 과거와 미래의 모든 요구를 충족시킨다. :)
cat

6
CLOC 문서에 따르면 @cat은 언어 정의 파일에서 읽을 수 있으므로 정의되지 않은 언어로 코드를 인식 할 수있는 방법이 있습니다. 또한 오픈 소스이므로 언제든지 더 확장 할 수 있습니다!
Centimane 2016 년

39

SLOCCount 또는 cloc 를 사용해야 할 것 입니다. 디렉토리 구조 등에 관계없이 프로젝트에서 소스 코드 라인을 계산하도록 특별히 설계되었습니다. 어느 한 쪽

sloccount .

또는

cloc .

현재 디렉토리에서 시작하여 모든 소스 코드에 대한 보고서를 생성합니다.

findand 을 사용하려면 wcGNU wc에 좋은 --files0-from옵션이 있습니다.

find . -name '*.[ch]' -print0 | wc --files0-from=-

( cloc 제안에 대해 SnakeDoc 에게 감사드립니다 !)


슬로 카운트의 경우 +1 흥미롭게도 sloccount /tmp/stackexchange(최근 재부팅 후 5 월 17 일에 다시 생성 ) 실행 하면 sh, perl, awk 등 파일을 개발하는 데 드는 추정 비용은 $ 11,029라고합니다. 스크립트 파일로 만들지 않은 단일 라이너는 포함되지 않습니다.
cas

11
코드 라인을 기준으로 비용을 추정하십니까? 스파게티를 유지 보수 가능한 것으로 리팩토링하기 위해 고용 한 모든 사람들은 어떻습니까?
Monica Harming 중지

@OrangeDog 당신은 항상 오버 헤드에서 그것을 설명하려고 시도 할 수 있습니다. 계산에 대한 설명 (이전 급여 데이터 포함) 및 조정할 수있는 매개 변수에 대한 설명은 설명서 를 참조하십시오 .
Stephen Kitt

5
cloc좋은뿐만 아니라입니다 : github.com/AlDanial/cloc
SnakeDoc은

@StephenKitt> 여전히 중요한 문제는 거꾸로 세는 것입니다. 코드를 정리할 때 종종 줄이 줄어 듭니다. 물론 제거 된 코드를 설명하기 위해 나머지 코드에서 발생하는 오버 헤드를 수동으로 처리 할 수는 있지만 처음부터 전체 가격을 추측하는 것보다 낫다는 것을 알 수 없습니다.
스펙트럼

10

wc명령은 여러 개의 인수를 취할 수 있으므로 GNU 작업의 인수 를 wc사용하여 모든 파일 이름을 전달할 수 있습니다 .+-execfind

find . -type f -name '*.[ch]' -exec wc -l {} +

또는 bash에서 쉘 옵션 globstar을 사용 하여 디렉토리를 재귀 적으로 순회합니다.

shopt -s globstar
wc -l **/*.[ch]

다른 쉘은 기본적으로 재귀 적으로 순회 zsh하거나 (예 :) globstar적어도 대부분의 것과 비슷한 옵션을 갖습니다 .


1
루트가없는 머신에 비표준 소프트웨어를 설치할 필요가 없기 때문에 +1
Bamboomy

5

당신은 사용할 수 find와 함께 xargs하고 wc:

find . -type f -name '*.h' -o -name '*.c' | xargs wc -l

2
(파일 경로에 공백, 줄 바꿈, 작은 따옴표, 백 슬래시 문자의 큰 따옴표가 포함되어 있지 않다고 가정합니다. total여러 wcs가 호출 되면 여러 줄이 출력 될 수도 있습니다 .)
Stéphane Chazelas

아마도 여러 wc명령 문제는 구조 로 배관 find하여 해결할 수 있습니다 while read FILENAME; do . . .done. 그리고 while 루프 내부에서 사용하십시오 wc -l. 나머지는 총 라인을 변수로 합산하여 표시합니다.
Sergiy Kolodyazhnyy 2016 년

5

당신이 cloc등에 액세스 할 수없는 환경에 있다면 나는 제안 할 것입니다

find -name '*.[ch]' -type f -exec cat '{}' + | grep -c '[^[:space:]]'

런스 루 : find이름이 .c또는로 끝나는 모든 일반 파일을 재귀 적으로 검색 합니다. 공백이 아닌 모든 행 (간격이 아닌 문자가 하나 이상 포함 된 행)을 계산하기 위해 출력이 파이프됩니다 ..hcatgrep


4

의견에서 지적 된 바와 같이, cat file | wc -l하지 에 해당 wc -l file후자 인쇄 번호와 파일 이름 반면 이전 인쇄 때문에 단지 숫자입니다. 마찬가지로 cat * | wc -l숫자 만 wc -l *인쇄하고 각 파일에 대한 정보 줄을 인쇄합니다.

단순성의 정신으로 실제로 묻는 질문을 다시 살펴 보겠습니다.

코드 줄을 세고 싶다면 사소한 것은

cat *.c *.h | wc -l

그러나 하위 디렉토리가 여러 개인 경우 어떻게해야합니까?

첫째, 사소한 명령조차 단순화하여 다음을 수행 할 수 있습니다.

cat *.[ch] | wc -l

마지막으로 many-subdirectory에 해당하는 것은 다음과 같습니다.

find . -name '*.[ch]' -exec cat {} + | wc -l

추가하여 일치하는 파일을 디렉토리가 아닌 일반 파일로만 제한하는 등 여러 가지 방법으로 향상시킬 수 있습니다. -type f그러나 지정된 find명령 은와 정확히 동일 cat *.[ch]합니다.


3

다음을 사용하는 샘플 awk:

find . -name '*.[ch]' -exec wc -l {} \; |
  awk '{SUM+=$1}; END { print "Total number of lines: " SUM }'

+대신에 사용하십시오 \;.
Jonathan Leffler

@JonathanLeffler 왜?
Hastur

1
@Hastur : 그것은 실행 wc -l하지 않고 같은 파일 그룹에 대한 xargs않지만, 하나 필요없이 파일 이름 (공백 등) 홀수 볼 문자를 처리 xargs하거나 (비표준) -print0-0옵션 findxargs각각. 사소한 최적화입니다. 단점은 wc여러 파일이 주어질 때 마다 호출 할 때마다 총 줄 수를 출력한다는 awk것입니다. 스크립트는이를 처리합니다. 따라서 슬램 덩크가 아니지만 with +를 대신 사용 하는 것이 좋습니다. \;find
Jonathan Leffler 2016 년

@JonathanLeffler 감사합니다. 동의한다. 그러나 내 관심사는에 전달 된 매개 변수 문자열의 길이에 관한 것 wc입니다. 만약 알 수없는 선험적 될 파일의 수를 발견 , 그 한계를 통과 할 수있는 위험이있다거나 어떻게 든 발견에 의해 처리됩니다?
Hastur

2
@Hastur : find파일을 편리한 크기 번들로 그룹화하여 플랫폼의 인수 목록에 대한 길이 제한을 초과하지 않으므로 환경 (인수 목록 길이에서 나오는)을 허용하므로 인수 목록의 길이에 환경의 길이는 최대 값보다 작아야합니다). IOW, find직업이 그렇듯이 xargs직업이 옳습니다.
Jonathan Leffler 2016 년

1

쉬운 명령 :

find . -name '*.[ch]' | xargs wc -l

(파일 경로에 공백, 줄 바꿈, 작은 따옴표, 백 슬래시 문자의 큰 따옴표가 포함되어 있지 않다고 가정합니다. total여러 wcs가 호출 되면 여러 줄이 출력 될 수도 있습니다 .)
Stéphane Chazelas

0

Linux를 사용하는 경우 자체 도구 polyglot을 권장 합니다. 보다 획기적 cloc이고 빠릅니다 sloccount.

제공된 바이너리가 없지만 BSD에서도 빌드 할 수 있어야합니다.

당신은 그것을 호출 할 수 있습니다

poly .

-2

find . -name \*.[ch] -print | xargs -n 1 wc -l트릭을해야합니다. -exec출력을에 파이핑하는 대신 사용 하는 등 여러 가지 가능한 변형이 있습니다 wc.


4
그러나 find . -name \*.[ch] -print파일의 내용을 인쇄하지 않고 파일 이름 만 인쇄하십시오. 그래서 대신 파일 수를 세지 않습니까? `xargs '가 필요합니까?
Niklas Rosencrantz 2016 년

@ Programmer400 예, 필요 합니다. 파일이 많은 경우 xargs여러 wc호출 을 감시해야 합니다. 모든 total줄 을 찾아 합산해야합니다.
Stephen Kitt

총 라인 수를 원한다면해야 할 것find . -name \*.[ch] -print0 | xargs -0 cat | wc -l
솜털 같은

이 ( find . -name \*.[ch] -print | wc -l)는 파일 수를 계산합니다 (파일 이름에 줄 바꿈이 포함되어 있지 않는 한 매우 드물지 않은 경우). 파일의 행 수는 계산하지 않습니다.
Jonathan Leffler 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.