题目
统计目录下所有文本文件的行数总和
信息
- 类型:问答
- 难度:⭐
考点
文件遍历,条件判断,命令替换,变量操作
快速回答
使用Shell脚本统计指定目录下所有.txt文件的总行数:
- 遍历目录中的所有文件
- 检查文件扩展名是否为
.txt - 使用
wc -l统计每个文件行数 - 累加行数到总和变量
示例代码:total=0
for file in dir/*.txt; do
[[ -f "$file" ]] && ((total += $(wc -l < "$file")))
done
echo "总行数: $total"
解析
问题场景
在日志分析、数据处理等场景中,经常需要统计某个目录下所有文本文件的总行数,这是Shell脚本的基础应用。
解决方案
#!/bin/bash
dir="/path/to/directory" # 目标目录
total_lines=0
# 遍历目录中的.txt文件
for file in "$dir"/*.txt; do
# 检查是否为普通文件(非目录/链接)
if [[ -f "$file" ]]; then
# 统计文件行数并累加
lines=$(wc -l < "$file")
total_lines=$((total_lines + lines))
fi
done
echo "总行数: $total_lines"核心原理
- 文件遍历:
for file in $dir/*.txt使用通配符匹配所有.txt文件 - 条件判断:
[[ -f "$file" ]]确保处理的是普通文件(排除目录等) - 命令替换:
$(wc -l < "$file")获取文件行数(<避免输出文件名) - 变量操作:
$(( ))进行整数运算累加行数
最佳实践
- 始终用双引号包裹变量(如
"$file"),防止文件名含空格时出错 - 使用
wc -l < file替代wc -l file,避免解析文件名 - 添加错误处理:
if [ ! -d "$dir" ]; then echo "目录不存在"; exit 1; fi
常见错误
| 错误示例 | 后果 | 修正方案 |
|---|---|---|
for file in *.txt | 目录路径错误时匹配当前目录文件 | 明确指定"$dir"/*.txt |
lines=`wc -l "$file"` | 输出包含文件名导致计算错误 | 改用wc -l < "$file" |
total_lines += lines | 语法错误 | 使用$((total + lines)) |
扩展知识
- 递归统计子目录:改用
find "$dir" -name "*.txt" -type f配合while read循环 - 性能优化:大文件场景可用
awk 'END{print NR}' file替代wc - 其他文件类型:修改通配符(如
*.log)或使用case语句支持多扩展名