我在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 .
答案 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 在第二个字段上按编号排序 - 即文件数。