「du」を毎月グループ化できますか?

「du」を毎月グループ化できますか?

写真がたくさん入ったカタログがあります。具体的にはdu -sh --apparent-size /path/to/myfolder331Gをもらいました。本当にすごいです。しかし、今リストを毎月グループ化したいと思います。たとえば、次のようになります。

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

Linuxの組み込み機能を使用してこれを実行する(合理的な)方法はありますか、それを行うためにPythonユーティリティを直接作成する必要がありますか?

ベストアンサー1

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

おすすめ記事