给定文件的大小(以字节为单位),我想用IEC(二进制)前缀将其格式化为带有尾随零的3位有效数字,例如1883954变为1.80M.
bash不支持浮点运算,所以我改用了awk.问题是我不知道如何保持尾随零.当前解决方案
if [ $size -ge 1048576 ]
then
size=$(awk 'BEGIN {printf "%.3g",'$size'/1048576}')M
elif [ $size -ge 1024 ]
then
size=$(awk 'BEGIN {printf "%.3g",'$size'/1024}')K
fi
Run Code Online (Sandbox Code Playgroud)
(文件不是很大,所以我不必考虑更大的单位.)
编辑:这是另一个问题.请参阅下面的AdrianFrühwirth的评论.
标题确实说明了一切,但我目前正在使用一个带有 case 语句的简单函数将人类可读的文件大小字符串转换为以字节为单位的大小。它工作得很好,但是移植到其他代码中有点笨拙,所以我很想知道是否有任何广泛可用的命令可以替代 shell 脚本使用?
基本上我想获取诸如“100g”或“100gb”之类的字符串并将它们转换为字节。
我目前正在做以下事情:
to_bytes() {
value=$(echo "$1" | sed 's/[^0123456789].*$//g')
units=$(echo "$1" | sed 's/^[0123456789]*//g' | tr '[:upper:]' '[:lower:]')
case "$units" in
t|tb) let 'value *= 1024 * 1024 * 1024 * 1024' ;;
g|gb) let 'value *= 1024 * 1024 * 1024' ;;
m|mb) let 'value *= 1024 * 1024' ;;
k|kb) let 'value *= 1024' ;;
b|'') let 'value += 0' ;;
*)
value=
echo "Unsupported units '$units'" >&2
;;
esac
echo "$value"
} …Run Code Online (Sandbox Code Playgroud)