You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动