ファイルの数とサイズを含むディレクトリのリストを取得する最も簡単な方法は何ですか?

ファイルの数とサイズを含むディレクトリのリストを取得する最も簡単な方法は何ですか?

私が望むのは、ディレクトリを繰り返してサブディレクトリに関する情報を非常に特定の形式で出力して、ユーザーに適していて、後で、awkなどgrepのツールを使用して解析できるようにすることですsed

これはbashスクリプトの関数内で実行され、ユーザー端末に印刷されます。遺言に似ていますlsが、特定の列、順序、フィールドがあります。その上に関数を再実行し、awk興味のあるディレクトリだけをキャプチャするなどのタスクにパイプし、そのディレクトリdiffに対して別のタスクを実行します。

~/Parent/2017
Directory Name    Size       Last Modified     Number of Files                 
2017-08-25        1.9 GB     Aug 30   16:39    141
2017-08-26        152 MB     Aug 27   12:57    48
2017-08-29        5.9 GB     Aug 30   7:19     462
2017-08-30        102 MB     Sep 2    14:36    20
2017-08-31        2.0 GB     Sep 1    9:18     148
2017-09-01        1.2 GB     Sep 5    10:21    89

私のParentディレクトリが次のようなとき

> ls -l ~/Parent/
2015
2016
2017
Backups
Catalog-file.data
'Temporary Folder DE2B14BB-1052-4FF0-B4E7-B94C0E3CC6F8'
backup-logs
rsync.log

今まで私はこのようなものを持っています

  IFS=$'\n';
  for d in `find -maxdepth 1 -type d | grep -P "\d{4}" | grep -v -P "[a-z]+"`; do
    for sd in `find ${d} -maxdepth 1 -type d`; do
      file_count=`ls -lh ${sd} | wc -l`
    done
    ls -lh ${d} | awk -v fc="$file_count" '{printf "%-13s %-8s %-5s %-5s %-8s %-8s \n", $8, $4, $5, $6, $7, fc}'
  done

私はそれが正しく動作しないことを知っています。私は今まで持っているコードを提供しましたが、恥ずかしいです。file_count各出力ラインに対して変数()を保存する方法はawk?注:ls「サイズ」列を変数に置き換えるには、この情報が必要な場合があります。du -sh directory_name

通常、問題を解決し続けることができます。しかし、その地点に到達したとき、おそらく難しい方法でやったかもしれないし、より簡単な方法があるかもしれないと思いました。どう思いますか?そのようなサイクルは2つありますか?それとももっと簡単な方法がありますか?

ベストアンサー1

GNUツールを使用すると、次のことができます。

find . \( -path './*/*' -o -type d \) -printf '%TF %TH:%TM/%s/%p\0' |
  gawk -F/ -v 'RS=\0' '
    BEGIN{split("K/M/G/T/P/E/Z/Y", u)}
    function h(n, i) {
      while (n >= 1024) {n /= 1024; i++}
      return sprintf("%.4g%s", n, u[i])
    }
    {s[$4] += $2; n[$4]++}
    NF == 4 {t[$4] = $1}
    END{
      PROCINFO["sorted_in"] = "@ind_str_asc"
      for (d in t) printf "%-13s %-8s %s %s\n", d, h(s[d]), t[d], n[d]
    }'

つまり、数量と累積を計算することです。確かに繰り返しディレクトリ内のすべてのファイルのサイズ(ディスク使用量ではない)(より深いファイルを考慮したくない場合は1つ追加)-maxdepth 2findディスク使用量の場合、ブロック数を計算してハードリンクを一度だけ計算すると、より複雑になります。

おすすめ記事