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
相关产品推荐
相关产品推荐

