如何统计项目代码行数?

在软件开发过程中,统计项目代码行数是一项常见的任务。这不仅可以帮助我们了解项目规模,还能在一定程度上评估开发进度和代码质量。本文将介绍几种在Linux/Unix环境下使用find命令结合其他工具统计代码行数的实用方法。

1. 基本方法:find + wc

最简单的方法是使用find命令查找所有的代码文件,然后通过管道传递给wc -l命令来统计行数。

1.1 统计特定扩展名的文件行数

find . -name "*.js" -o -name "*.css" -o -name "*.html" | xargs wc -l

这个命令会查找当前目录及其子目录下所有.js、.css和.html文件,并统计它们的总行数。

1.2 排除特定目录

在实际项目中,我们可能需要排除一些目录,如node_modules、vendor或dist等。可以使用-not -path参数来实现:

find . -name "*.js" -not -path "*/node_modules/*" -not -path "*/dist/*" | xargs wc -l

1.3 仅显示总行数

如果只需要知道总行数而不需要每个文件的行数,可以使用-c参数:

find . -name "*.java" -type f -exec cat {} \; | wc -l

或者更简单的方式:

find . -name "*.java" -type f | xargs cat | wc -l

2. 更详细的统计:按文件类型分组

有时候我们需要了解不同类型文件的代码行数分布,可以通过以下方法实现:

for ext in js css html; do
  echo "$ext 文件总行数:"
  find . -name "*.$ext" -type f | xargs cat | wc -l
done

3. 过滤空行和注释

如果想要得到更准确的代码行数统计(去除空行和注释),可以结合grep命令:

3.1 去除空行

find . -name "*.py" -type f | xargs grep -v "^$" | wc -l

3.2 去除空行和注释(以Python为例)

find . -name "*.py" -type f | xargs grep -v "^$" | grep -v "^[[:space:]]*#" | wc -l

对于其他语言,注释的格式不同,需要调整正则表达式。例如,对于JavaScript:

find . -name "*.js" -type f | xargs grep -v "^$" | grep -v "^[[:space:]]*//" | grep -v "^[[:space:]]*/\*" | grep -v "^[[:space:]]*\*/" | wc -l

4. 根据 .gitignore 文件排除文件和目录

在实际项目开发中,.gitignore文件已经定义了我们不需要跟踪的文件和目录(如编译输出、依赖包、临时文件等)。我们可以利用这个文件来排除这些文件进行代码统计,这样可以获得更准确的项目代码量统计。

4.1 使用 git ls-files 命令

git ls-files命令会列出所有被git跟踪的文件,自动排除了.gitignore中定义的文件和目录。我们可以结合这个命令来统计代码行数:

# 统计所有被git跟踪的文件的总行数
git ls-files | xargs wc -l

# 仅显示总行数
git ls-files | xargs cat | wc -l

# 统计特定类型的文件行数
git ls-files "*.js" "*.css" "*.html" | xargs wc -l

4.2 使用 git check-ignore 结合 find 命令

如果你的项目还没有初始化git仓库,或者你想自定义一些排除规则,可以使用git check-ignore命令来检查文件是否被忽略:

# 使用git check-ignore过滤被忽略的文件
find . -type f -not -path "*/\.git/*" | git check-ignore -v --stdin | cut -f 3 | xargs wc -l

这个命令的工作原理是:

  1. 使用find查找所有文件(排除.git目录)
  2. 通过git check-ignore检查每个文件是否被忽略
  3. 使用cut提取文件路径
  4. 通过xargs和wc -l统计行数

4.3 手动实现 .gitignore 过滤(不依赖git)

如果你不想使用git,也可以手动实现类似.gitignore的过滤功能:

#!/bin/bash

# 读取.gitignore文件中的规则
gitignore_rules=()
if [ -f ".gitignore" ]; then
  while IFS= read -r line || [ -n "$line" ]; do
    # 跳过空行和注释行
    [[ -z "$line" || "$line" == \#* ]] && continue
    # 添加到规则数组
    gitignore_rules+=("$line")
  done < ".gitignore"
fi

# 构建find命令参数
exclude_args=""
for rule in "${gitignore_rules[@]}"; do
  # 简单处理.gitignore规则,实际情况可能更复杂
  if [[ "$rule" == */* ]]; then
    exclude_args+=" -not -path \"*/$rule\""
  else
    exclude_args+=" -not -name \"$rule\""
  fi
done

# 执行代码行数统计
command="find . -type f -not -path \"*/\.git/*\" $exclude_args | xargs wc -l"
eval "$command"

注意:这个脚本只是简单实现了.gitignore的部分功能,对于复杂的模式匹配(如**递归匹配、!否定等)可能不够准确。

5. 实用脚本示例

下面是一个综合的shell脚本,可以统计多种类型文件的代码行数,并支持根据.gitignore排除文件:

#!/bin/bash

# 定义文件类型
declare -a extensions=(".js" ".ts" ".jsx" ".tsx" ".css" ".scss" ".html" ".json" ".md")

# 定义要排除的目录
declare -a exclude_dirs=()

# 从.gitignore读取排除规则(可选)
if [ -f ".gitignore" ]; then
  while IFS= read -r line || [ -n "$line" ]; do
    # 跳过空行、注释行和否定规则
    [[ -z "$line" || "$line" == \#* || "$line" == \!* ]] && continue
    
    # 处理目录规则
    if [[ "$line" == */ ]]; then
      dir_name="${line%/}"
      exclude_dirs+=($dir_name)
    fi
  done < ".gitignore"
fi

# 手动添加常见的排除目录
exclude_dirs+=("node_modules" "dist" "build" "coverage" ".git")

# 构建排除路径参数
exclude_args=""
for dir in "${exclude_dirs[@]}"; do
  exclude_args+=" -not -path \"*/$dir/*\""
done

# 统计总行数
total_lines=0

# 按文件类型统计
for ext in "${extensions[@]}"; do
  # 执行find命令并统计行数
  command="find . -name \"*$ext\" -type f $exclude_args | xargs cat | wc -l"
  lines=$(eval "$command")
  
  # 累加总行数
  total_lines=$((total_lines + lines))
  
  # 输出结果
  printf "%10s 文件: %7d 行\n" "$ext" "$lines"
done

# 输出总行数
echo "----------------------------"
printf "%10s: %7d 行\n" "总计" "$total_lines"

6. 总结

统计代码行数是一项简单但实用的工作。通过本文介绍的方法,你可以轻松地统计项目代码行数,无论是简单的计数还是更复杂的分组统计,甚至可以利用现有的.gitignore文件来排除不需要统计的文件。

主要方法包括:

  1. 使用find命令结合wc命令进行基本统计
  2. 根据.gitignore文件排除不需要统计的文件和目录,可以通过git ls-files命令或手动解析.gitignore文件实现
  3. 使用grep命令过滤空行和注释,获得更准确的统计结果

find命令是Linux/Unix系统中功能强大的文件查找工具,结合wc、grep等命令,可以完成各种复杂的代码统计任务。通过合理利用这些工具,你可以得到更准确、更有意义的代码行数统计结果。

希望这些方法对你有所帮助!如果你有其他更好的方法,欢迎在评论区分享。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以邮件至 ethan89@aliyun.com

赏

×

喜欢就点赞,疼爱就打赏