ディレクトリ下のファイルの行数を数えるワンライナー

俺が使う言語に全部マッチさせると場合

ruby -e 'pattern=/.*(\.as|\.js|\..+ml|\.cpp|\.c|\.cs|Makefile.*|\.rb|\.sh)$/; sum=0; for i in 0..10 do Dir.glob("*/"*i+"*").delete_if{|n|!(n =~ pattern) or File::ftype(n) != "file"}.each{|f| n=open(f).readlines.size; puts "#{n}\t#{f}";sum+=n} end; puts "total #{sum}"'

で、今までのソースコードが置いてあるファイルサーバで実行したら3056703行だった。もちろん自動生成や、読み込んだライブラリが大半で、こんなにキーボード打っていたら骨折する。


最初のpatternの所で正規表現で計算するファイルを指定しているので、
cとcppだけ数えるとするとこうなる。

ruby -e 'pattern=/.*\.(cpp|c)$/; sum=0; for i in 0..5 do Dir.glob("*/"*i+"*").delete_if{|n|!(n =~ pattern) or File::ftype(n) != "file"}.each{|f| n=open(f).readlines.size; puts "#{n}\t#{f}";sum+=n} end; puts "total #{sum}"'

実行するとファイル毎の行数と、最後に合計行数が出る

10      hello.cpp
6       boost/cast/main.cpp
20      boost/filelist/main.cpp
18      boost/rand/main.cpp
30      boost/regex/main.cpp
19      boost/regex_match/regex_match.cpp
19      boost/scoped_ptr/main.cpp
18      boost/thread/main.cpp
32      gloox/gtalk/main.cpp
1       opencv/bgsubavg/image.cpp
23      opencv/image/image.cpp
715     opencv/samples/c/blobtrack.cpp
229     opencv/samples/c/camshiftdemo.c
90      opencv/samples/c/contours.c
40      opencv/samples/c/convert_cascade.c
104     opencv/samples/c/convexhull.c
238     opencv/samples/c/delaunay.c
125     opencv/samples/c/demhist.c
137     opencv/samples/c/dft.c
165     opencv/samples/c/distrans.c
184     opencv/samples/c/drawing.c
68      opencv/samples/c/edge.c
182     opencv/samples/c/facedetect.c
185     opencv/samples/c/ffilldemo.c
152     opencv/samples/c/fitellipse.c
60      opencv/samples/c/houghlines.c
43      opencv/samples/c/image.cpp
84      opencv/samples/c/inpaint.cpp
111     opencv/samples/c/kalman.c
88      opencv/samples/c/kmeans.c
72      opencv/samples/c/laplace.c
526     opencv/samples/c/letter_recog.cpp
195     opencv/samples/c/lkdemo.c
107     opencv/samples/c/minarea.c
108     opencv/samples/c/morphology.c
201     opencv/samples/c/motempl.c
314     opencv/samples/c/mushroom.cpp
100     opencv/samples/c/pyramid_segmentation.c
224     opencv/samples/c/squares.c
147     opencv/samples/c/watershed.cpp
112     opencv/study/bgsubavg/image.cpp
135     opencv/study/bgsubavg-contour/image.cpp
74      opencv/study/detect-face/detect-face.cpp
99      opencv/study/haar/haartest.cpp
23      opencv/study/image/image.cpp
81      opencv/study/motionDetectDiff/image.cpp
131     opencv/study/motionDetectDiffMoment/image.cpp
80      opencv/study/opticalflow/image.cpp
94      opencv/study/skincolor/skincolor.cpp
110     opencv/study/transimg/transimg.cpp
112     opencv/study-win/BgSubAvg/bgsubAvg.cpp
74      opencv/study-win/BgSubSimple/bgsub.cpp
95      opencv/study-win/ColorTrack/colortrack.cpp
99      opencv/study-win/ColorTrackContour/colortrackcontour.cpp
27      opencv/study-win/SimpleCapture/image.cpp
94      opencv/study-win/SkinColorPic/skincolor.cpp
total 6630

階層の深さは for i in 0..5の5をいじればいい。


とあるrailsプロジェクト内でrb、なんとかml(yml/yaml/html/kmlなど)とcgiとかの行数を出した場合

ruby -e 'pattern=/.*\.(rb|.+ml|txt|cgi)$/; sum=0; for i in 0..5 do Dir.glob("*/"*i+"*").delete_if{|n|!(n =~ pattern) or File::ftype(n) != "file"}.each{|f| n=open(f).readlines.size; puts "#{n}\t#{f}";sum+=n} end; puts "total #{sum}"'
109     config/boot.rb
19      config/database.yml
59      config/environment.rb
7       config/mongrel_cluster.yml
37      config/routes.rb
142     doc/memo.txt
30      public/404.html
30      public/422.html
30      public/500.html
10      public/dispatch.cgi
10      public/dispatch.rb
13      public/geophoto-dev.kml
13      public/geophoto.kml
13      public/geophoto2.kml
22      public/index.html
5       public/robots.txt
38      test/test_helper.rb
10      app/controllers/application.rb
36      app/controllers/photos_controller.rb
3       app/helpers/application_helper.rb
2       app/helpers/photos_helper.rb
17      app/models/photo.rb
18      config/environments/development.rb
19      config/environments/production.rb
22      config/environments/test.rb
10      config/initializers/inflections.rb
9       config/initializers/mime_types.rb
17      db/migrate/001_create_photos.rb
7       test/fixtures/photos.yml
45      test/functional/photos_controller_test.rb
8       test/unit/photo_test.rb
total 810