linux – BASH:相同名称目录的总和大小

首先,我是一个bash菜鸟,所以请温柔:)

我试图总结不同位置但具有相同名称的文件夹的大小.它看起来像这样:

root
--- directory 1

------ folder 1
--------subfolder 1
--------subfolder 2
------ folder 2
--------subfolder 3
--------subfolder 4
------ folder 3
--------subfolder 5
--------subfolder 6

--- directory 2

------ folder 1
--------subfolder 1
--------subfolder 2
------ folder 2
--------subfolder 3
--------subfolder 4
------ folder 3
--------subfolder 5
--------subfolder 6

我试图将子目录1到6的大小相加并将其输出到.csv

目前我只是在两个单独的CSV文件中输出子目录的大小.一个用于目录1,一个用于目录2

目前我有这个输出我在需要的地方运行的子尺寸:

du -h --max-depth=1 --block-size=GB * | grep "[\/]" | sort -n -r > ~/lists/disks/RC_job.csv

输出看起来像这样:

40GB folder1/subfolder1

15GB folder1/subfolder2

10GB folder2/subfolder 3
...

我有一个输出目录1和一个目录2.我想从目录一和二总结子文件夹的大小,并有一个看起来像这样的输出

60GB subfolder1

25GB subfolder2

10GB subfolder3

其中subfolder1是directory1 / folder1 / subfolder1 directory2 / folder1 / subfolder1

这是我在这里的第一篇文章,我不知道这是否足够的信息.如果有必要,我很乐意提供更多.我很确定这可以用awl完成,但我还没有真正使用它.

干杯!

编辑以回答评论中的问题:

(部分输出)du -h / net / rcq-rp / job / rcq / vault / image / film / net / rcq-rp / job / rcq / film –max-depth = 1 –block-size = GB *是:

1GB /net/rcq-rp/job/rcq/vault/image/film/nr106/nr106_0010
1GB /net/rcq-rp/job/rcq/vault/image/film/nr106/nr106_0020
1GB /net/rcq-rp/job/rcq/vault/image/film/nr106/nr106_0030
1GB /net/rcq-rp/job/rcq/vault/image/film/nr106/nr106_0035
1GB /net/rcq-rp/job/rcq/vault/image/film/nr106/nr106_0040
1GB /net/rcq-rp/job/rcq/vault/image/film/nr106/nr106_0045
2GB /net/rcq-rp/job/rcq/vault/image/film/nr106/nr106_0050
1GB /net/rcq-rp/job/rcq/vault/image/film/nr106/nr106_0060
1GB /net/rcq-rp/job/rcq/film/nr106/nr106_0010
1GB /net/rcq-rp/job/rcq/film/nr106/nr106_0020
1GB /net/rcq-rp/job/rcq/film/nr106/nr106_0030
1GB /net/rcq-rp/job/rcq/film/nr106/nr106_0035
1GB /net/rcq-rp/job/rcq/film/nr106/nr106_0040
1GB /net/rcq-rp/job/rcq/film/nr106/nr106_0045
1GB /net/rcq-rp/job/rcq/film/nr106/nr106_0050
1GB /net/rcq-rp/job/rcq/film/nr106/nr106_0060

理想情况下,最终输出将是:

2GB nr106_0010

etc...

解决方法:

一种方法是使用关联数组.关联数组将一系列键映射到值,例如:

directory1 -> 10 GB
directory2 -> 12 MB
directory3 -> 40 KB

关联数组中的键必须是唯一的.那很棒!我们目录的路径也是唯一的.我们把它们放在一个关联数组中.我将在awk中展示如何执行此操作,但是许多其他语言都有关联数组(如Perl,它们称之为哈希).

du | awk '{ val = $1; dir = $2; sizes[dir] = val }'

(为了简单起见,我把你传给杜的论点拿出来了)

这是做什么的? awk逐行读取du的输出;对于每一行,它向关联数组大小添加一个元素,目录名称作为索引,大小作为值.如果我们的原始输入看起来像这样

40GB folder1/subfolder1
15GB folder1/subfolder2
10GB folder2/subfolder1

我们的数组看起来像这样:

sizes[folder1/subfolder1] -> 40GB
sizes[folder1/subfolder2] -> 15GB
sizes[folder2/subfolder1] -> 10GB

但在我们的最终输出中,我们只想查看子目录的值. awk具有字符串操作的功能,所以让我们调整代码以去除前导目录:

du | awk '{ val = $1; dir = $2; sub(/^.*\//, "", dir); sizes[dir] = val }'

子功能剥离了从路径的最后一个到开头的所有内容.现在我们的数组看起来像这样:

sizes[subfolder2] -> 15GB
sizes[subfolder1] -> 10GB

大!现在我们只有子目录的值.只有一个小问题.值不是总计.由于我们有多个名为subfolder1的子目录,我们用第二个值(10GB)覆盖了第一个值(40GB).当我们遇到已存在于数组中的索引时,我们真正想要做的是将其值添加到现有值:

du | awk '{ val = $1; dir = $2; sub(/^.*\//, "", dir); sizes[dir] += val }'

(我改变了尺寸[dir] = val,它使用了赋值,尺寸为[dir] = val,它将val添加到已经在尺寸[dir]中的任何尺寸)

awk神奇地为我们处理了一些事情,比如将15GB转换为15号.现在我们的数组看起来像这样:

sizes[subfolder2] -> 15
sizes[subfolder1] -> 50

这向我们展示了我们正在寻找的总数.现在,我们如何展示这个?我们可以循环遍历数组并打印出键和值,如下所示:

du | awk '{ val = $1; dir = $2; sub(/^.*\//, "", dir); sizes[dir] += val } \
          END { for (dir in sizes) print dir, sizes[dir], "GB" }'

我们的结果是

subfolder1 50 GB
subfolder2 15 GB

编辑:这是我在更新的问题中使用du输出得到的结果.

nr106_0060 2 GB
nr106_0050 3 GB
nr106_0045 2 GB
nr106_0040 2 GB
nr106_0035 2 GB
nr106_0030 2 GB
nr106_0020 2 GB
nr106_0010 2 GB
上一篇:linux中命令查看存储情况


下一篇:Linux命令学习记录之du