使用 du 获取目录的总大小作为数字

Getting the total size of a directory as a number with du

使用命令du,我想得到一个目录的总大小

命令输出du myfolder:

5454 kkkkk
666  aaaaa
3456788 total

我可以提取最后一行,但不能删除字符串 total:

du -c myfolder | grep total | cut -d ' ' -f 1

结果:

3456788 total

想要的结果

3456788

我想将所有命令集中在一行中。

首先,您可能想使用 tail -n1 而不是 grep total ...考虑一下如果您有一个名为 local 的目录会发生什么? :-)

现在,让我们看看 duhexdump 的输出:

$ du -c tmp | tail -n1 | hexdump -C
00000000  31 34 30 33 34 34 4b 09  74 6f 74 61 6c 0a        |140344K.total.|

就是K后面的字符0x09man ascii告诉我们:

   011   9     09    HT  '\t' (horizontal tab)   111   73    49    I

这是一个标签,不是 space :-)

制表符已经是默认的分隔符(这在 POSIX 规范中指定,因此您可以放心地依赖它),所以您根本不需要 -d

所以,把它们放在一起,我们最终得到:

$ du -c tmp | tail -n1 | cut -f1
140344K

这可能是因为它是制表符分隔的(这是 cut 的默认分隔符):

~$ du -c foo | grep total | cut -f1
4
~$ du -c foo | grep total | cut -d'   ' -f1
4

要插入制表符,请使用 Ctrl+v,然后使用 TAB

或者,您可以使用 awk 打印以 total:

结尾的行的第一个字段
~$ du -c foo | awk '/total$/{print }'
4

我建议为此使用 awk:

value=$(du -c myfolder | awk '/total/{print }')

这只是提取与模式匹配的行的第一个字段 "total"。

如果它始终是您感兴趣的最后一行,另一种方法是使用这个:

value=$(du -c myfolder | awk 'END{print }')

最后一行字段的值在END块中是可以访问的,因此您可以通过这种方式获取最后一行的第一个字段。

为什么不用-s来概括呢?这样你就不必grep "total",等等

$ du .
24  ./aa/bb
...
       # many lines
...
2332    .
$ du -hs .
2.3M    .

然后,要获取值,请通过管道传输到 awk。这样您就不必担心分隔符是 space 还是制表符:

du -s myfolder | awk '{print }'

来自man du

   -h, --human-readable
          print sizes in human readable format (e.g., 1K 234M 2G)

   -s, --summarize
          display only a total for each argument