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

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

私が望むのは、ディレクトリを繰り返してサブディレクトリに関する情報を非常に特定の形式で出力して、ユーザーに適していて、後で、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ディスク使用量の場合、ブロック数を計算してハードリンクを一度だけ計算すると、より複雑になります。

答え2

スクリプトの特定の部分に対するfindGNUコマンドの操作に慣れていますか-printf?現在実行している操作に応じてファイル情報の表示をカスタマイズできます。ファイル検索と表示の両方を実行すると、スクリプトを簡素化できます。

このコマンドの柔軟性を説明するには、次のようにします。

find -name '*.sh' -printf 'Script %P last accessed on %D at %r. Owned by %u with permissions set to %M'

...同様の結果...

Script foo.sh last accessed on 03/01/17 at 10:15 PM. Owned by joe.blow with permissions set to -rwx-r-x-r-x
Script bar.sh last accessed on 03/22/17 at 02:42 AM. Owned by joe.blow with permissions set to -rw--r---r--

考えられるほとんどすべてのファイル属性に対して約30の異なるディレクティブがあり、日付形式はそれに基づいているため、strftime非常に強力で柔軟です。これらのフラグには、左/右揃え、最小数値幅などの一般的な修飾子もあります。

関連情報