2013-09-24 57 views
3

首先的总和大小,我是一个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

目前,我有这个给我跑subfodlers的输出大小,我需要他们:

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的输出。我想总结从目录1和2的子文件夹的大小,并有一个看起来像这样的输出

60GB subfolder1 

25GB subfolder2 

10GB subfolder3 

哪里subfolder1是directory1目录/文件夹1/subfolder1 + directory2 /文件夹1/subfolder1

这是我在这里的第一篇文章,我不知道这是否足够的信息。如果有必要,我会很高兴提供更多。我很确定这可以用锥来完成,但我还没有真正使用过。

干杯!

编辑回答问题的意见:

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

选择您的文本并使用编辑输入框左上角的“{}”工具根据需要应用“代码示例”格式。请修改您的问题,以包含“第二列中的重复内容”的样子以及您需要的输出内容。如果您想“添加重复的大小和输出结果”,则不清楚。一个实际的输入和要求的输出(正如你已经开始做的那样)将使人们更容易帮助你。祝你好运。 – shellter

+0

谢谢你的建议。它完成了,希望它更好! :) – titatom

+0

为什么需要'grep“[\ /]”'? – konsolebox

回答

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 
+0

感谢您使用此解决方案和一个很好的解释。 还有一件事:子文件夹不在folder1和folder2中,它位于directory1/folder1和directory2/folder1中。 我不得不两次找到我想总结的文件夹的大小。一旦进入directory1,再进入directory2。如果我理解正确,您所解释的代码只会汇总位于同一目录中的文件夹。 我正确吗? 再次感谢您的帮助! – titatom

+0

@titatom你可以将多个参数传递给'du',例如'du dir1 dir2'。 – ThisSuitIsBlackNot

+0

非常感谢。我会马上试试这个! – titatom

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将大小(第一列)加起来,将结果存储在由目录名称(最后一列)索引的关联数组中。