You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写Shell脚本统计指定路径下文件与目录数量的问题

解决Shell脚本统计文件/目录数量的问题

我来帮你排查这个脚本的问题,咱们一步步拆解:

原脚本的核心错误

你的脚本现在有几个关键问题,导致统计结果始终为0:

  1. 循环遍历对象错误
    原循环for item in $path; do只会把$path这个字符串本身当作遍历项,而不是路径下的所有文件/目录。比如你传~/Desktop时,循环只处理了~/Desktop这一个“项”,完全没去读目录里的内容。

  2. 文件类型判断缺少目标
    [ -d ]和[ -f ]这种写法是无效的,test命令(也就是[ ])必须指定要检查的对象,应该写成[ -d "$item" ]和[ -f "$item" ],不然它只会检查空字符串的状态,永远返回false。

  3. 变量自增语法不兼容
    num_dir+=1是bash的扩展语法,但你的脚本用的是#!/bin/sh(部分系统里sh是严格遵循POSIX标准的shell),POSIX shell不支持这种自增方式,得换成num_dir=$((num_dir + 1))。

  4. ~路径未正确展开
    当你在命令行输入~/Desktop时,shell会自动把~展开成你的家目录,但如果脚本里直接用$path接收这个参数(尤其是用户用引号括起来传参时),~可能不会被正确解析,导致路径无效。

修正后的脚本

这里给你调整后的版本,解决了所有问题,还加了参数容错(没传路径时默认用当前目录):

#!/bin/sh
# 若未传入路径参数,默认使用当前目录
path="${1:-.}"

# 处理~路径的展开,确保路径有效
eval "path=$path"

num_file=0
num_dir=0

# 遍历路径下的所有非隐藏文件/目录
for item in "$path"/*; do
    # 跳过路径为空的情况(比如目录下无任何内容时,$path/*会原样返回)
    [ -e "$item" ] || continue

    if [ -d "$item" ]; then
        num_dir=$((num_dir + 1))
    elif [ -f "$item" ]; then
        num_file=$((num_file + 1))
    fi
done

echo "The number of directories is $num_dir"
echo "The number of files is $num_file"

用法说明

  1. 先给脚本加执行权限:chmod +x count_files.sh
  2. 运行方式:
    • 统计当前目录:./count_files.sh
    • 统计指定目录:./count_files.sh ~/Desktop 或者直接传绝对路径./count_files.sh /home/yourname/Desktop

额外补充(可选)

如果需要统计包括隐藏文件/目录的内容,把循环里的"$path"/*改成"$path"/.* "$path"/*,同时要排除.和..这两个特殊目录:

for item in "$path"/.* "$path"/*; do
    # 跳过.、..以及不存在的项
    case "$item" in
        "$path"/.|"$path"/..) continue ;;
    esac
    [ -e "$item" ] || continue
    # 后续判断逻辑不变
done

内容的提问来源于stack exchange,提问作者Tarracon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:44:34