Here’s silly (and long) Python script I wrote a while back to count the number of lines in files recursively through a dir. (I guess I was fed up with ‘find ../ -iname “*cpp” | xargs wc -l” or just utterly bored or using Windows…)
#!/usr/bin/python # # Usage: # ./count_lines.py [path_to_dir_or_file] __author__ = "Rui Barbosa Martins (ruibmartins@gmail.com)" import optparse import os.path import sys def getNumberOfLines(filePath): fp = file(filePath, "r"); numberOfLines = len(fp.readlines()) fp.close() return numberOfLines def visit((fileTypesIncluded, files), dirname, names): for f in names: filePath = os.path.join(dirname, f) if (fileTypesIncluded == ["*"] or filter(lambda fe: f.endswith(fe), fileTypesIncluded)) and os.path.isfile(filePath): files[filePath] = getNumberOfLines(filePath) def main(startPath, fileTypesIncluded): if not os.path.exists(startPath): print "Error: Path [%s] does not exist." % (startPath) sys.exit(-1) elif os.path.isfile(startPath): files = {startPath: getNumberOfLines(startPath)} else: fileTypes = "|".join(fileTypesIncluded) absPath = os.path.abspath(startPath) print "Searching for extensions '%s' in '%s'." % (fileTypes, absPath) files = {} os.path.walk(startPath, visit, (fileTypesIncluded, files)) keys = files.keys() keys.sort() total = 0 longestLength = 0 groups = {} for key in keys: if longestLength < len(key): longestLength = len(key) for key in keys: spaces = " " * (longestLength - len(key)) print "%s%s %d" % (key, spaces , files[key]) total = total + files[key] if len(keys) > 1: print "Total lines of code: %d" % (total) def parseArgs(): usage = "Usage: %prog [Options] FILE_OR_DIRECTORY" parser = optparse.OptionParser(usage=usage) parser.add_option("-f", "--file_extensions", dest="file_extensions", help="File extensions to count in. (comma separated)", metavar="FILE_TYPES", default=[".*"]) (options, args) = parser.parse_args() fe = options.file_extensions if not args: path = "." elif len(args) == 1: path = args[0] else: parser.print_help() print "Error: Too many paths provided. Only one expected." sys.exit(0) if type(fe) == str: fe = map(lambda s: s.strip(), fe.split(",")) if not fe or filter(lambda s: "*" in s, fe): fe = ["*"] return path, fe if __name__ == "__main__": main(*parseArgs())