Shell脚本设置目录变量及统计目录文件数的问题
解决Shell脚本统计目录文件数量的问题
我来帮你搞定这个脚本的问题,你的代码里有几个容易踩的小坑,咱们一步步修正:
你的脚本存在的问题
- 命令替换错误:给
count变量赋值时,没有用命令替换语法,直接写count=ls $directory | wc -l会被Shell解析成把ls作为count的赋值内容,然后执行$directory | wc -l,这显然不是你想要的。 - 变量名不一致:你定义的目录变量是
directory,但输出时用了$folder,这会导致输出里的目录名是空的。 - ls统计的局限性:用
ls配合wc -l统计,遇到文件名包含空格、换行符或者特殊字符时,会出现统计错误。
修正后的脚本(基础版)
先针对你原来的思路做最小修复,保证能正常运行:
#!/bin/bash # 检查是否传入了目录参数 if [ $# -eq 0 ]; then echo "请指定要统计的目录,例如:./test.sh project" exit 1 fi directory=$1 # 使用命令替换获取文件数量,-1参数让ls每行输出一个文件,双引号包裹目录名防止空格问题 count=$(ls -1 "$directory" | wc -l) echo "$directory has $count files"
更可靠的写法(避免ls的坑)
如果要处理带特殊字符的文件名,推荐用Shell数组来统计,更安全:
#!/bin/bash if [ $# -eq 0 ]; then echo "请指定要统计的目录,例如:./test.sh project" exit 1 fi directory=$1 # 开启nullglob:如果目录为空,数组不会保留"*"字符串;开启dotglob:匹配隐藏文件 shopt -s nullglob dotglob # 把目录下的所有文件存入数组 files=("$directory"/*) # 数组的长度就是文件数量 count=${#files[@]} echo "$directory has $count files"
如果需要统计子目录里的所有文件
如果要递归统计包括子目录在内的所有普通文件,可以用find命令:
#!/bin/bash if [ $# -eq 0 ]; then echo "请指定要统计的目录,例如:./test.sh project" exit 1 fi directory=$1 # -type f 表示只统计普通文件,排除目录本身 count=$(find "$directory" -type f | wc -l) echo "$directory has $count files (including files in subdirectories)"
内容的提问来源于stack exchange,提问作者Yoo SungKyung




