gpt4 book ai didi

linux - 巴什 : Sum size of same name directories

转载 作者:可可西里 更新时间:2023-11-01 11:49:28 25 4
gpt4 key购买 nike

首先,我是一个 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 }'

(为了简单起见,我去掉了你传递给 du 的参数)

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

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 }'

sub 函数会剥离从最后一个 / 到路径开头的所有内容。现在我们的数组看起来像这样:

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

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

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

(我将使用赋值的 sizes[dir] = val 更改为 sizes[dir] += val,它添加了 valsizes[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 - 巴什 : Sum size of same name directories,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18986707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com