返回

在 Bash 中使用 awk 以人类可读格式显示文件大小

Linux

用人类可读的格式显示文件大小

背景

当你处理文件时,了解其大小至关重要。但是,以字节为单位表示文件大小并不直观。为了便于理解,我们通常希望以人类可读的格式显示文件大小,例如千字节 (KB)、兆字节 (MB) 等。

挑战

在 Bash 中,由于它不支持浮点运算,使用 awk 来格式化文件大小带来了挑战。此外,保留尾随零也至关重要,以确保格式化的一致性和准确性。

解决方案

为了解决这些挑战,我们提出了一种使用 awk 的方法:

if [ $size -ge 1048576 ]
then
    size=$(awk 'BEGIN {printf "%.3fM",'$size'/1048576}')
elif [ $size -ge 1024 ]
then
    size=$(awk 'BEGIN {printf "%.3fK",'$size'/1024}')
fi

此方法使用 awk 的 printf 函数将文件大小格式化为 3 位有效数字,并根据大小选择适当的单位 (M 或 K)。为了保留尾随零,我们使用 %.3f 格式,其中 f 表示浮点数。

缺点

虽然此方法可以很好地处理大多数情况,但它有一个缺点。当文件大小正好是 1024 或 1048576 的倍数时,它会将尾随零截断。

改进的解决方案

为了解决此缺点,我们修改了 awk 脚本:

if [ $size -ge 1048576 ]
then
    size=$(awk 'BEGIN {printf "%.3gM",'$size'/1048576}')
elif [ $size -ge 1024 ]
then
    size=$(awk 'BEGIN {printf "%.3gK",'$size'/1024}')
else
    size=$(awk 'BEGIN {printf "%.3g",'$size'}')
fi

在改进的脚本中,我们添加了第三个条件语句来处理文件大小小于 1024 字节的情况。这确保了无论文件大小如何,都将保留尾随零。

结论

通过使用 awk,我们可以以人类可读的格式轻松地将文件大小格式化为 3 位有效数字和尾随零。这种格式化方法使文件大小更易于理解,并增强了应用程序的可用性和可读性。

常见问题解答

  1. 为什么不使用浮点运算?

    Bash 不支持浮点运算,因此我们使用 awk 作为替代方案。

  2. 如何更改有效数字的位数?

    printf 函数中,.3 指定有效数字的位数。您可以根据需要调整此数字。

  3. 如何处理更大的文件大小?

    如果您处理的文件大小更大,可以添加额外的条件语句来支持更大的单位,例如 GB 和 TB。

  4. 如何同时显示多个单位?

    为了同时显示多个单位,您需要使用更复杂的格式化字符串。例如,要显示 KB 和 MB,您可以使用 printf "%.1fKB/%.1fMB",'$size'/1024,'$size'/1048576'

  5. 如何自定义单位名称?

    要自定义单位名称,请在格式化字符串中指定它们。例如,要将 MB 更改为 "MiB",您可以使用 printf "%.3fMiB",'$size'/1048576'