1

我在 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    .
4

1 回答 1

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";

<(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(因为包含文件夹本身)。然后我们可以将结果粘贴在一起以获得(几乎)最终输出。

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

于 2014-02-24T13:20:50.830 回答