如何用Shell获取文件夹中文件总数的20%(取整)?
解决Shell统计文件数量并计算百分比整数的问题
我来帮你排查代码里的问题,然后给出可行的解决方案~
首先,你的代码有两个关键错误导致运行失败:
- 变量赋值语法错误:
file_num= find . -type f | wc -l里的=后面多了空格,Shell里变量赋值时=前后不能有空格,必须用命令替换$(...)把命令输出赋值给变量。 expr不支持浮点数运算:expr只能处理整数计算,你用它乘0.2(浮点数)肯定会报错,得换用支持浮点数的工具来处理。
修正后的完整方案
这里提供两种常用的实现方式,你可以根据需求选择:
方式1:用bc做浮点数运算 + printf取整
# 正确获取当前目录及子目录下的文件总数(只统计文件,排除目录) total_files=$(find . -type f | wc -l) prob_select=0.2 # 用bc计算乘积,再用printf四舍五入取整 selected_num=$(printf "%.0f" $(echo "$total_files * $prob_select" | bc)) echo "20% 的文件数量为:$selected_num"
方式2:用awk一步完成计算+取整(更简洁)
如果不需要单独保存总数,直接用awk处理更高效:
# 直接计算并输出20%的整数结果(默认截断取整,比如20.9会变成20) selected_num=$(find . -type f | wc -l | awk -v prob=0.2 '{print int($1 * prob)}') # 如果需要四舍五入,把print改成printf: # selected_num=$(find . -type f | wc -l | awk -v prob=0.2 '{printf "%.0f", $1 * prob}') echo "20% 的文件数量为:$selected_num"
额外说明
- 如果只需要统计**当前目录(不包括子目录)**的文件,给
find加-maxdepth 1参数即可:find . -maxdepth 1 -type f | wc -l - 取整逻辑:
int()是直接截断小数部分(比如20.9→20),printf "%.0f"会做四舍五入(20.9→21),你可以根据实际需求选择。
内容的提问来源于stack exchange,提问作者Jame
相关产品推荐
相关产品推荐

