月ごとにグループ化された「du」を取得できますか?


14

たくさんの写真が入ったディレクトリがあります。具体的にdu -sh --apparent-size /path/to/myfolderは、331Gを提供します。それは素晴らしいです。しかし今、私は月ごとにグループ化されたリストを取得したい、例えば次のようなもの:

2016-01   20MB
2016-02  520MB
2016-03  312MB
...

Linuxのビルトインでこれを行うための(合理的な)方法はありますか、それを行うために独自のPythonユーティリティを作成する必要がありますか?


1
Linuxにはビルトインがなく、オペレーティングシステムカーネルです。代わりに、一部のLinuxベースのオペレーティングシステム(Debian、Fedora、ChromeOSなど)でデフォルトで検出されるコマンドを意味しますか?
ステファンシャゼラス

8
LinuxカーネルはLinuxカーネルであり、Linuxカーネルの組み込みを意味するのであれば、それは言ったでしょう。あなたが熱心でなければならない場合、私はあなたが統計的にトップ5のLinuxディストリビューションのいずれかのデフォルトインストールでインストールした可能性が高いツールの一般的なセットを意味します。
ウェインワーナー

1
@WayneWernerつまり、Bash、Coreutils、およびGNUオペレーティング環境の他のコアコンポーネントを含むGNU / Linuxを意味します。#rmswasright
ダミアンジェリック

回答:


23

Linuxでは、次を試してください。

find /my/path -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk '{b[$1]+=$2} END{for (date in b) print date, b[date]}' | sort

使い方

  • find /my/path

    これは、/ my / path内のファイルを探します。

  • -maxdepth 1

    これはfind、サブディレクトリを調べないように指示します。(再帰検索が必要な場合は、このオプションを省略してください。)

  • -type f

    これはfind、検索を通常のファイルに制限するように指示します。

  • -printf '%TY-%Tm %s\n'

    これはfind、各ファイルのバイト単位のサイズが後に続く年月を印刷するように指示します。

    使用しないため、見つかったファイルの名前は出力されません。

  • b[$1]+=$2

    見つかったファイルごとに、列2から見つかったバイトカウントを、連想配列内のその年月の組み合わせのカウントに追加しますb

  • END{for (date in b) print date, b[date]}

    からのすべての出力を処理した後find、結果を出力します。

  • sort

    これにより、結果が日付順にソートされます。

複数行バージョン

コードが複数行に広がることを好む人向け:

find /my/path -maxdepth 1 -type f -printf '%TY-%Tm %s\n' |
  awk '
    {
      b[$1]+=$2
    }

    END{
      for (date in b)
        print date, b[date]
    }
    ' | sort

これらのファイルがあるディレクトリを考えてみましょう:

$ ls -l
total 27816
-rw------- 1 john1024 john1024 2459173 Nov 23  2015 img100.jpg
-rw------- 1 john1024 john1024 3479750 Nov 23  2015 img101.jpg
-rw------- 1 john1024 john1024 4028939 Nov 23  2015 img102.jpg
-rw------- 1 john1024 john1024 2928519 Jul 30 18:55 img103.jpg
-rw------- 1 john1024 john1024 2948294 Jul 30 18:55 img104.jpg
-rw------- 1 john1024 john1024 3177583 Aug  1 16:56 img105.jpg
-rw-rw---- 1 john1024 john1024 3111737 Apr 18  2016 img106.jpg
-rw-rw---- 1 john1024 john1024 1441310 Apr 18  2016 img107.jpg
-rw-rw---- 1 john1024 john1024 2430158 Apr 25 16:26 img108.jpg
-rw-rw---- 1 john1024 john1024 2424504 Apr 25 16:26 img109.jpg

コマンドの出力は次のとおりです。

$ find . -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk '{b[$1]+=$2} END{for (date in b) print date, b[date]}' | sort
2015-11 9967862
2016-04 9407709
2016-07 5876813
2016-08 3177583

絞り込み

バイトではなくメビバイト(MiB)で出力する場合は、次のように単位を変換できます。

$ find . -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk '{b[$1]+=$2} END{for (date in b) print date, b[date]/1024**2, "MiB"}' | sort
2015-11 9.50609 MiB
2016-04 8.97189 MiB
2016-07 5.60457 MiB
2016-08 3.03038 MiB

を使用して、出力形式をさらに制御できますprintf。ここでは、小数点の後に1桁だけを保持するために、サイズを%5.1f次のようにフォーマットします。

$ find . -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk '{b[$1]+=$2} END{for (date in b) printf "%s %5.1f MiB\n", date, b[date]/1024**2}' | sort
2015-11   9.5 MiB
2016-04   9.0 MiB
2016-07   5.6 MiB
2016-08   3.0 MiB

これは素晴らしいです。awkのチュートリアルをお勧めできますか?約20秒以内に目を交差させなかったものはまだ見つかりません。
hBy2Py

1
@ hBy2Py awkへの私のお気に入りの紹介は、少し古くなっていますが、Grymoireチュートリアルです。
-John1024

2列目にスペースパディングを追加するprintf "%s %9d\n", date, b[date]代わりに使用することをお勧めしprint date, b[date]ます
rav_kr

@rav_krいいね。を使用する例で答えを更新しましたprintf
John1024

あなたが持っている場合FWIWはfindそのサポートを-maxdepth、あなたはおそらく持っている[g]awkことを支持PROC_INFO["sorted_in"]="@ind_str_asc"
dave_thompson_085
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.