tit*_*tom 3 linux csv bash sum du
首先,我是一个 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
Run Code Online (Sandbox Code Playgroud)
我正在尝试对子目录 1 到 6 的大小求和并将其输出到 .csv
目前,我只是在两个单独的 CSV 文件中输出子目录的大小。一份用于目录 1,一份用于目录 2
目前,我可以输出我在需要的地方运行的子文件夹的大小:
du -h --max-depth=1 --block-size=GB * | grep "[\/]" | sort -n -r > ~/lists/disks/RC_job.csv
Run Code Online (Sandbox Code Playgroud)
输出如下所示:
40GB folder1/subfolder1
15GB folder1/subfolder2
10GB folder2/subfolder 3
...
Run Code Online (Sandbox Code Playgroud)
我有一个目录 1 的输出和一个目录 2 的输出。我想对目录一和目录二的子文件夹的大小进行求和,并得到如下所示的输出
60GB subfolder1
25GB subfolder2
10GB subfolder3
Run Code Online (Sandbox Code Playgroud)
其中 subfolder1 是目录 1/folder1/subfolder1 + 目录 2/folder1/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
Run Code Online (Sandbox Code Playgroud)
理想情况下,最终输出是:
2GB nr106_0010
etc...
Run Code Online (Sandbox Code Playgroud)
一种方法是使用关联数组。关联数组将一系列键映射到值,例如:
directory1 -> 10 GB
directory2 -> 12 MB
directory3 -> 40 KB
Run Code Online (Sandbox Code Playgroud)
关联数组中的键必须是唯一的。那太棒了!我们目录的路径也是唯一的。让我们将它们放入关联数组中。我将展示如何做到这一点,awk但许多其他语言都有关联数组(例如 Perl,它称之为哈希)。
du | awk '{ val = $1; dir = $2; sizes[dir] = val }'
Run Code Online (Sandbox Code Playgroud)
(为了简单起见,我取出了您传递给的论点du)
这是做什么的?逐行awk读取输出;du对于每一行,它都会向关联数组添加一个元素sizes,其中目录名称作为索引,大小作为值。如果我们的原始输入看起来像这样
40GB folder1/subfolder1
15GB folder1/subfolder2
10GB folder2/subfolder1
Run Code Online (Sandbox Code Playgroud)
我们的数组看起来像这样:
sizes[folder1/subfolder1] -> 40GB
sizes[folder1/subfolder2] -> 15GB
sizes[folder2/subfolder1] -> 10GB
Run Code Online (Sandbox Code Playgroud)
但在最终输出中,我们只想查看子目录的值。awk有字符串操作的函数,所以让我们调整我们的代码以去掉前导目录:
du | awk '{ val = $1; dir = $2; sub(/^.*\//, "", dir); sizes[dir] = val }'
Run Code Online (Sandbox Code Playgroud)
该sub函数会删除/路径中从最后一个到开头的所有内容。现在我们的数组看起来像这样:
sizes[subfolder2] -> 15GB
sizes[subfolder1] -> 10GB
Run Code Online (Sandbox Code Playgroud)
伟大的!现在我们只有子目录的值。只是有一个小问题。这些值不是总计。由于我们有多个名为 的子目录subfolder1,因此我们用第二个值 (10GB) 覆盖第一个值 (40GB)。当我们遇到数组中已经存在的索引时,我们真正想做的是将其值添加到现有值中:
du | awk '{ val = $1; dir = $2; sub(/^.*\//, "", dir); sizes[dir] += val }'
Run Code Online (Sandbox Code Playgroud)
(我将sizes[dir] = val,它使用赋值更改为sizes[dir] += val,它添加val到 中已有的内容sizes[dir])
awk神奇地为我们处理了一些事情,比如将 15GB 转换为数字 15。现在我们的数组如下所示:
sizes[subfolder2] -> 15
sizes[subfolder1] -> 50
Run Code Online (Sandbox Code Playgroud)
这向我们显示了我们正在寻找的总数。现在,我们如何显示它?我们可以循环遍历数组并打印出键和值,如下所示:
du | awk '{ val = $1; dir = $2; sub(/^.*\//, "", dir); sizes[dir] += val } \
END { for (dir in sizes) print dir, sizes[dir], "GB" }'
Run Code Online (Sandbox Code Playgroud)
我们的结果是
subfolder1 50 GB
subfolder2 15 GB
Run Code Online (Sandbox Code Playgroud)
编辑:这是我使用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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
793 次 |
| 最近记录: |