4

我想自定义输出:

du -hs *

例如输出:

23G    Test1
1.2M   Folder With Spaces
12G    Another Folder With Spaces

问题是我可以捕获第一列,但由于第二列可能包含空格,因此输出仅捕获第一个单词。有没有办法捕获包含的第二个列空间,或者可能返回该行的剩余内容?

du -hs * | awk '{print $1 " " $2;}'

以上返回:

23G Test1
1.2M Folder
12G Another

编辑:解决方案是添加 -F 并指定制表符分隔符:

du -hs * | awk -F'\t' '{print $1 " " $2;}'

制表符也是文件/文件夹中的有效字符。就我而言,这永远不会成为问题。

4

2 回答 2

3

对于我的du(GNU coreutils),大小和文件名由制表符分隔。因此,可以通过删除直到并包括第一个选项卡的所有内容来检索名称:

du -hs * | awk '{size=$1; name=$0; sub(/[^\t]*\t/, "", name); print name}'

注意:如果文件名包含换行符,上述操作将失败。根据您使用的操作系统,可能有解决此限制的方法。例如,在 linux(GNU 工具)上,du可以生成 GNU awk (gawk) 可以读取和解释的 NUL 分隔记录:

du -0hs * | awk -v RS='\0'  '{size=$1; name=$0; sub(/[^\t]*\t/, "", name); print "NAME="name}'
于 2015-07-30T21:09:38.377 回答
2

由于du使用制表符,而您的文件名不应包含制表符或换行符,您可以简单地使用cut(默认分隔符为制表符)。

du -hs * | cut -f1  # First field
du -hs * | cut -f2  # Second field
du -hs * | cut -f2-  # All fields >= 2 (if there are tabs in the filename)

除非您需要awk进一步处理,否则这应该足够了。

于 2015-07-30T22:41:13.820 回答