获取包含文件数量和大小的目录列表的最简单方法是什么

获取包含文件数量和大小的目录列表的最简单方法是什么

我想做的是循环目录并以非常特定的格式输出有关其子目录的信息,以便适合用户,并且也可以稍后使用awkgrep和等工具进行解析sed

这将在 bash 脚本的函数内部运行并打印到用户终端。很像一个lswill,但具有特定的列、顺序和字段。我将在此基础上再次运行该函数,将其通过管道传递给诸如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

通常我可以继续解决这个问题。但我想当我达到这一点时,我想我可能会以困难的方式做到这一点,并且有一种更简单的方法可以做到这一点。你们有什么感想?这样的两个循环?或者有没有更简单的方法。

答案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]
    }'

即计算数量和累计明显的目录中所有文件的大小(不是磁盘使用情况),递归地(如果您不想考虑更深层次的文件,请添加一个)-maxdepth 2find对于磁盘使用情况,您需要计算块计数,并且只计算一次硬链接,这会变得更加复杂。

答案2

针对脚本的某一特定部分,您熟悉 GNUfind命令的-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因此它非常强大/灵活。这些标志也具有常用的修饰符,例如左/右对齐、最小数字宽度等。

相关内容