ディレクトリ下のファイルの行数を数えるワンライナー
俺が使う言語に全部マッチさせると場合
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