使用“du”命令获取大小和其他信息

时间:2013-12-09 07:32:02

标签: linux bash unix uniq du

我在bash上做了一个小脚本,它显示了以mb为单位的总大小,文件数,文件夹数和文件夹名。 我有几乎所有东西,除了大小为mb

du -a -h | cut -d/ -f2 | sort | uniq -c

它显示如下:

  4 01 folder 01
  6 02 folder 02
 11 03 folder 03
 13 04 folder 04
 16 05 folder 05
 .....
 15 13 folder 13
  1 5.7G    .

如您所见,排序是:文件数,文件夹数和名称。

我想要这个:

  300M 4 01 folder 01
  435M 6 02 folder 02
  690M 11 03 folder 03
  780M 13 04 folder 04
  1.6G 16 05 folder 05
 .....
 15 13 folder 13
  1 5.7G    .

提前谢谢。

PD有一些方法可以像这样在每一列上显示名称吗?

  M    F  # name
  300M 4 01 folder 01
  435M 6 02 folder 02
  690M 11 03 folder 03
  780M 13 04 folder 04
  1.6G 16 05 folder 05
 .....
 15 13 folder 13
  1 5.7G    .

1 个答案:

答案 0 :(得分:3)

这个怎么样?

echo -e "Size\tFiles\tDirectory"; paste <(du -sh ./*/ | sort -k2 | cut -f1) <(find ./*/ | cut -d/ -f2 | uniq -c | sort -k2 | awk '{print ($1-1)"\t"$2}') | sort -nk2

示例输出:

Size    Files   Directory
172M    36      callrecords
17M     747     manual
83M     2251    input
7.5G    16867   output

<强>解释

添加标题:

echo -e "Size\tFiles\tDirectory";

&lt;(COMMAND)是一种允许输出命令的结构,就好像它是一个文件一样。 Paste需要2个文件,并排输出。所以我们将两个命令的输出粘在一起。首先是:

<(du -sh ./*/ | sort -k2 | cut -f1)

它只是找到当前文件夹的子文件夹的大小,总结内部的任何内容。然后根据文件/文件夹的名称对其进行排序,然后获取第一列。这为我们提供了当前文件夹子文件夹大小的列表,按名称排序。

第二个命令是:

<(find ./*/ | cut -d/ -f2 | uniq -c | sort -k2 | awk '{print ($1-1)"\t"$2}')

这与您的原始命令类似 - 它在当前目录下找到文件夹,截断名称以仅包含第一个子级别,然后计算它们以提供当前文件夹的子文件夹列表和文件数量每个人。然后按文件夹名称对其进行排序,awk命令格式化结果,并从每个文件夹的文件计数中减去1(因为包含文件夹本身)。然后我们可以将结果粘贴在一起以获得(几乎)最终输出。

最后,我们在粘贴命令的输出上使用 sort -nk2 在第二个字段上按编号排序 - 即文件数。

相关问题