3

まず第一に、私は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に出力しようとしています

現時点では、サブディレクトリのサイズを 2 つの個別の CSV ファイルに出力しているだけです。ディレクトリ 1 用に 1 つ、ディレクトリ 2 用に 1 つ

現時点では、必要な場所で実行するサブフォドラーのサイズを出力するためにこれを持っています:

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 つの出力があります。ディレクトリ 1 と 2 のサブフォルダのサイズを合計すると、次のような出力が得られます。

60GB subfolder1

25GB subfolder2

10GB subfolder3

subfolder1 は directory1/folder1/subfolder1 + directory2/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

理想的には、最終的な出力は次のようになります。

2GB nr106_0010

etc...
4

2 に答える 2

4

これを行う 1 つの方法は、連想配列を使用することです。連想配列は、一連のキーを値にマップします。次に例を示します。

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

連想配列内のキーは一意でなければなりません。それは素晴らしいことです!ディレクトリへのパスも一意です。それらを連想配列に入れましょう。でこれを行う方法を示しますawkが、他の多くの言語には連想配列があります (ハッシュと呼ばれる Perl など)。

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

du(簡単にするために、あなたが渡す引数を取り出しました)

これは何をしますか?awkの出力を 1du行ずつ読み取ります。行ごとに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、最初の値 (40GB) を 2 番目の値 (10GB) で上書きしました。配列に既に存在するインデックスに遭遇した場合、本当にやりたいことは、その値を既存の値に追加することです。

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

(sizes[dir] = val割り当てを使用する を、既にsizes[dir] += valあるものに追加する に変更しました)valsizes[dir]

awk15GB を数値 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
于 2013-09-24T17:44:49.670 に答える
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は、サイズ (最初の列) を合計し、その結果をディレクトリ名 (最後の列) でインデックス付けされた連想配列に格納します。

于 2013-09-24T17:17:31.687 に答える