如何将人性化的文件大小存储在变量中?

如何将人性化的文件大小存储在变量中?

基本上我想做的是制作一个脚本,该脚本将输出目录中大小超过阈值(在我的例子中为 2.2 GB)的所有文件及其大小。我尝试使用 stat 命令如下

a=$(stat -c '%s' example.txt)

但这将以字节为单位存储文件大小。我想要的是以人类可读的格式(MB,GB)存储和显示大小。我还考虑存储输出ls -lah,然后修剪结果,以便仅存储名称和大小,但这似乎是一项乏味的任务。除了将结果存储在字节中然后对其进行算术运算之外,还有其他方法可以做到这一点吗?

答案1

由于您已经在使用 GNU 工具,请参阅numfmtGNU coreutils:

$ stat -c %s file
310776
$ stat -c '%s' file | numfmt --to=si
311K
$ stat -c '%s' file | numfmt --to=iec
304K
$ stat -c '%s' file | numfmt --to=iec-i
304Ki
$ stat -c '%s' file | numfmt --to=si --suffix=B
311KB

ksh93

$ size=$(stat -c %s file)
$ printf "%#d %#i\n" "$size" "$size"
311k 304Ki

或者,如果使用ls内置函数构建(您也可以在ast-开放包裹):

$ type ls
ls is a shell builtin version of /opt/ast/bin/ls
$ ls -Z '%#(size)d %#(size)i' file
311k 304Ki

答案2

不需要脚本,只需使用du -d 0 -t 2200M -h /some/dir/name/*.

例子。用于du显示所有文件/垃圾桶比...更棒50万

du -d 0 -t 500K -h /bin/*

输出:

1.1M    /bin/bash
620K    /bin/btrfs
2.0M    /bin/busybox
1.6M    /bin/ksh93
788K    /bin/zsh

sort有一个免费-h的可以按大小对以上内容进行排序:

du -d 0 -t 500K -h /bin/* | sort -h

输出:

620K    /bin/btrfs
788K    /bin/zsh
1.1M    /bin/bash
1.6M    /bin/ksh93
2.0M    /bin/busybox

答案3

善良的人这里提出了一个可以帮助您的解决方案:

find . -type f -size +2G -exec ls -sh {} \; 2> /dev/null

将以人类可读的形式为您提供完全限定的路径名​​和大小,所有这些都经过很好的排序。

如果你想2.2G那么find将无法处理小数,所以你必须做一些数学运算并使用(2048 + 205 =) 2253M

find . -type f -size +2253M -exec ls -sh {} \; 2> /dev/null

您可以使用 的参数来限制搜索深度和所需的大小find(请参阅man find),并使用awk将列输出到文件或数组中。

编辑:-lh 更改为 -sh 并根据 @Olorin 改进删除 awk

答案4

du -h example.txt|cut -f 1

( -h=人类可读

这是在假设你的“人类可读性”的想法和这个概念的想法是一样的。

相关内容