본문 바로가기

Cygwin

find 명령으로 전체 소스의 라인 수 세기

아직도 프로젝트를 진행하면서 라인수를 중요시 하지는 않겠지만, 그래도 대략적인 지표로 고려할 수는 있습니다. 이런 부분의 전문적인 프로그램이 있는지는 모르겠으나 이전 글()에서 본 find 와 라인수를 셀 수 있는 wc 명령으로 전체 소스의 라인수를 세어보도록 하겠습니다.


Cygwin (http://zeany.net/15) 이 설치되어 있거나, Unix 환경이라고 가정하고 라인수를 셀 프로젝트는 있다고 가정합니다. 여기서는 지금까지 안드로이드에서 살펴봤던 WebView 프로젝트 (https://github.com/zeany/webview.git) 로 세어보도록 하겠습니다.


wc는 기본적으로 단어(word)를 세는 프로그램입니다. 이를 라인수를 세도록 하려면 wc -l 처럼 -l을 옵션으로 주면 됩니다. 하나의 파일의 라인수를 세려면 wc -l a.java 식으로 하면 됩니다.


이를 find 명령과 같이 써본다면 다음처럼 한다고 생각할 수도 있습니다.


find . -name "*.java" -exec wc -l {} \;


결과는 다음과 같습니다. 보면 알겠지만 find로 찾은 파일에 대해 각각 wc -l 을 실행하므로 각 파일의 라인수를 세서 보여줍니다. 전체 파일의 라인수를 알려면 다시 더해야 하는 수 밖에 없습니다.


$ find . -name "*.java" -exec wc -l {} \;

13 ./app/build/generated/source/buildConfig/androidTest/debug/zeany/net/webview/test/BuildConfig.java

13 ./app/build/generated/source/buildConfig/debug/zeany/net/webview/BuildConfig.java

13 ./app/build/generated/source/r/androidTest/debug/android/support/test/espresso/R.java

13 ./app/build/generated/source/r/androidTest/debug/android/support/test/rule/R.java

16 ./app/build/generated/source/r/androidTest/debug/zeany/net/webview/test/R.java

1458 ./app/build/generated/source/r/debug/android/support/v7/appcompat/R.java

42 ./app/build/generated/source/r/debug/com/google/android/gms/R.java

10 ./app/build/generated/source/r/debug/com/google/firebase/firebase_core/R.java

14 ./app/build/generated/source/r/debug/zeany/net/webview/Manifest.java

7117 ./app/build/generated/source/r/debug/zeany/net/webview/R.java

26 ./app/src/androidTest/java/zeany/net/webview/ExampleInstrumentedTest.java

94 ./app/src/main/java/zeany/net/webview/MainActivity.java

14 ./app/src/main/java/zeany/net/webview/MyFirebaseInstanceIDService.java

42 ./app/src/main/java/zeany/net/webview/MyFirebaseMessagingService.java

16 ./app/src/test/java/zeany/net/webview/ExampleUnitTest.java


이를 개선할 방법을 | (파이프) 를 가지고 생각해 보려고 합니다.

단순하게 find . -name "*.java" | wc -l 과 같이 해버리면 이건 프로젝트의 java 파일의 개수를 세버리게 됩니다.


$ find . -name "*.java" | wc -l

15


wc 명령에 대해서 다시 한번 살펴보면 wc 뒤에 여러 개의 파일을 붙여서 실행하면 그 여러 개의 파일 각각에 대해 처리 후 최종적으로 합해서 결과를 보여주는 일을 합니다. 예를 들어 아래처럼 3개의 파일을 인수로 주면 3개의 파일의 총 라인수는 150 라인이라는 것을 알 수 있습니다.


$ cd ./app/src/main/java/zeany/net/webview


$ wc -l MainActivity.java MyFirebaseInstanceIDService.java MyFirebaseMessagingService.java

  94 MainActivity.java

  14 MyFirebaseInstanceIDService.java

  42 MyFirebaseMessagingService.java

 150 합계


이제 find 명령의 결과를 wc -l 의 인수로 보내면 될 것 같습니다. 하지만 | 는 이미 알다시피 이전 (find) 결과를 이후 프로그램의 stdin (입력) 으로 주는 것이지 인수로 주는 것은 아닙니다. 
Unix에서는 입력을 인수로 변환해 주는 xargs라는 프로그램이 이미 있습니다.

직접 사용을 해본 결과는 다음과 같습니다. MainActivity.java 등 3개의 파일은 직접 입력을 한 것입니다. 그리고 입력을 끝내려면 Ctrl + D를 누르면 됩니다. 이렇게 하면 stdin으로 입력한 3개의 파일이 wc -l 의 인수로 들어가게 됩니다.

$ xargs wc -l
MainActivity.java
MyFirebaseInstanceIDService.java
MyFirebaseMessagingService.java
  94 MainActivity.java
  14 MyFirebaseInstanceIDService.java
  42 MyFirebaseMessagingService.java
 150 합계

사실 xargs는 거의 | (파이프)의 뒤에 쓰이게 됩니다. 즉, find 로 찾은 결과를 모조리 wc -l 의 인수로 넣을 수 있는 방법이 바로 xargs를 사용하는 것입니다. 

이제 프로젝트의 라인 수를 find 와 wc 그리고 xargs를 이용해서 알아 보도록 하겠습니다.

$ find . -name "*.java" -print | xargs wc -l
    13 ./app/build/generated/source/buildConfig/androidTest/debug/zeany/net/webview/test/BuildConfig.java
    13 ./app/build/generated/source/buildConfig/debug/zeany/net/webview/BuildConfig.java
    13 ./app/build/generated/source/r/androidTest/debug/android/support/test/espresso/R.java
    13 ./app/build/generated/source/r/androidTest/debug/android/support/test/rule/R.java
    16 ./app/build/generated/source/r/androidTest/debug/zeany/net/webview/test/R.java
  1458 ./app/build/generated/source/r/debug/android/support/v7/appcompat/R.java
    42 ./app/build/generated/source/r/debug/com/google/android/gms/R.java
    10 ./app/build/generated/source/r/debug/com/google/firebase/firebase_core/R.java
    14 ./app/build/generated/source/r/debug/zeany/net/webview/Manifest.java
  7117 ./app/build/generated/source/r/debug/zeany/net/webview/R.java
    26 ./app/src/androidTest/java/zeany/net/webview/ExampleInstrumentedTest.java
    94 ./app/src/main/java/zeany/net/webview/MainActivity.java
    14 ./app/src/main/java/zeany/net/webview/MyFirebaseInstanceIDService.java
    42 ./app/src/main/java/zeany/net/webview/MyFirebaseMessagingService.java
    16 ./app/src/test/java/zeany/net/webview/ExampleUnitTest.java
  8901 합계

총 8,901 라인이네요. (물론 대부분은 생성된 java 파일이지만, 여기서는 그것을 구분하는 것이 목적이 아니니까요.)

이상으로 Cygwin에서 프로젝트의 라인수를 세는 방법에 대해서 알아봤습니다.
여러 다른 용도로 활용 가능하니 각자의 상황에 맞게 사용하세요.


'Cygwin' 카테고리의 다른 글

find 명령의 -exec 옵션을 이용해 파일 삭제  (2) 2017.01.16
Cygwin 드라이브 이동 방법  (3) 2017.01.13
Cygwin 신규 패키지 설치  (1) 2017.01.11
Cygwin 설정  (0) 2017.01.11
Cygwin 다운로드 및 설치  (2) 2017.01.05