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

Van*_*waj 4 size bash shell-script files

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

a=$(stat -c '%s' example.txt)
Run Code Online (Sandbox Code Playgroud)

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

Sté*_*las 7

由于您已经在使用 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
Run Code Online (Sandbox Code Playgroud)

ksh93

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

或者如果使用内置程序构建ls(您也可以在ast-open包中作为独立实用程序获得):

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


bu5*_*man 3

好心人在这里提出了一个应该可以帮助您的解决方案:

find . -type f -size +2G -exec ls -sh {} \; 2> /dev/null
Run Code Online (Sandbox Code Playgroud)

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

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

find . -type f -size +2253M -exec ls -sh {} \; 2> /dev/null
Run Code Online (Sandbox Code Playgroud)

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

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