首先,我是一个bash noob,所以请保持温柔:)
我试图将不同位置但具有相同名称的文件夹的大小相加。它看起来像这样:
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完成,但我还没有真正使用它。
干杯!
编辑以回答评论中的问题:
{p>(部分)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...
答案 0 :(得分:4)
执行此操作的一种方法是使用关联数组。关联数组将一系列键映射到值,例如:
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
,将val
添加到sizes[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
答案 1 :(得分:1)
我不确定你最终需要多少个csv文件,但这可能会有所帮助:
du -h --block-size=GB ./* | awk -F "[: \t/]" '{size[$NF] += $1} END {for (dir in size) print size[dir], dir}' | sort -n -r
命令size[$NF] += $1
对结果存储在由目录名(最后一列)索引的关联数组中的大小(第一列)进行求和。