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

Linux下计算指定文件总大小的bash脚本执行异常求助

解决你的bash脚本错误并实现文件总大小计算

首先,咱们先拆解你遇到的两个问题:

1. 「ambiguous redirect」错误的原因

你在脚本里用了 < 后跟反引号包裹的命令,shell会把这个命令的输出当成要打开的文件名,而不是把命令的输出作为read的输入源——这就导致了重定向歧义,直接触发了这个错误。

正确的做法是用bash的进程替换特性,把命令的输出模拟成一个文件,语法是 < <(你的命令);或者用管道把命令输出直接传给while循环。

2. sh cal.sh运行时的末尾异常

这是因为sh通常是dash(POSIX标准shell),它不支持bash的一些特性,而且你的循环逻辑只是打印每个文件的大小,没有处理命令输出结束后的状态,加上管道传递数据时的子shell问题,才会出现末尾的异常提示。


方案一:修正while循环实现求和(推荐bash环境用)

这个方案既解决了重定向问题,又实现了总大小的累加计算:

#!/bin/bash
# 初始化总大小为0
total_size=0

# 用进程替换传递命令输出给read循环
while IFS='' read -r file_size || [[ -n "$file_size" ]]; do
    # 累加每个文件的大小
    ((total_size += file_size))
done < <(ls -l | grep opencv | awk '{print $5}')

# 输出结果
echo "含opencv的文件总大小: $total_size 字节"

运行前记得给脚本加执行权限:

chmod +x cal.sh
./cal.sh

方案二:用管道+while循环(兼容更多shell)

如果你的环境只能用POSIX标准shell(比如sh),可以改成管道方式:

#!/bin/sh
total_size=0

ls -l | grep opencv | awk '{print $5}' | while read -r file_size; do
    total_size=$((total_size + file_size))
done

echo "含opencv的文件总大小: $total_size 字节"

方案三:一步到位用awk求和(最简洁高效)

其实完全不需要while循环,直接用awk就能完成过滤+求和的操作,代码更简洁,效率也更高:

#!/bin/bash
ls -l | grep opencv | awk '{sum += $5} END {print "含opencv的文件总大小: " sum " 字节"}'

额外提醒

如果你的「部分文件」包含目录,那ls -l输出的第5列是目录本身的元数据大小(不是目录里所有文件的总大小),这时候你需要用du命令来计算目录内容的大小,比如:

# 计算所有含opencv的文件/目录的总大小(字节)
du -bc *opencv* | tail -1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:00:04