使用 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
的目录会发生什么? :-)
现在,让我们看看 du
和 hexdump
的输出:
$ 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
后面的字符0x09
,man 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
使用命令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
的目录会发生什么? :-)
现在,让我们看看 du
和 hexdump
的输出:
$ 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
后面的字符0x09
,man 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