linux - 对所有目录进行文件类型统计

标签 linux bash count

我有一个 bash 脚本,可以递归地计算过去 45 天内编辑过的所有目录中的文件数

 find . -type f -mtime -45| rev | cut -d . -f1 | rev | sort | uniq -ic | sort -rn

我有一个名为

的目录
\parent

在 parent 中我有:

\parent\a
\parent\b
\parent\c

我将在文件夹 a 上运行一次上述脚本,在 b 上运行一次,在 c 上运行一次。

当前输出为:

     91 xls
     85 xlsx
     49 doc
     46 db
     31 docx
     24 jpg
     22 pub
     10 pdf
      4 msg
      2 xml
      2 txt
      1 zip
      1 thmx
      1 htm
      1 /ic

我想在 \parent 中的所有文件夹上从 \parent 运行脚本并获得如下输出:

+-------+------+--------+
| count | ext  | folder |
+-------+------+--------+
|    91 | xls  | a      |
|    85 | xlsx | a      |
|    49 | doc  | a      |
|    46 | db   | a      |
|    31 | docx | a      |
|    24 | jpg  | a      |
|    22 | pub  | a      |
|    10 | pdf  | a      |
|     4 | msg  | a      |
|    98 | jpg  | b      |
|    92 | pub  | b      |
|    62 | pdf  | b      |
|     2 | xml  | b      |
|     2 | txt  | b      |
|     1 | zip  | b      |
|     1 | thmx | b      |
|     1 | htm  | b      |
|     1 | /ic  | b      |
|    66 | txt  | c      |
|    48 | msg  | c      |
|    44 | xml  | c      |
|    30 | zip  | c      |
|    12 | doc  | c      |
|     6 | db   | c      |
|     6 | docx | c      |
|     3 | jpg  | c      |
+-------+------+--------+

如何使用 bash 完成此操作?

最佳答案

将其放入脚本中,使其可执行:chmod +x script.sh 并运行:./script.sh

#!/bin/sh

find . -type f -mtime -45 2>/dev/null \
    | sed 's|^\./\([^/]*\)/|\1/|; s|/.*/|/|; s|/.*.\.| |p; d' \
    | sort | uniq -ic \
    | sort -b -k2,2 -k1,1rn \
    | awk '
BEGIN{ 
    sep = "+-------+------+--------+"
    print sep "\n| count | ext  | folder |\n" sep
}

{ printf("| %5d | %-4s | %-6s |\n", $1, $3, $2) }

END{ print sep }'
  • sed 's|^\./\([^/]*\)/|\1/|; s|/.*/|/|; s|/.*.\.| |p; d'

    1. s|^\./\([^/]*\)/.*/|\1 |./a/file.xls 替换为 a/file.xls.
    2. s|/.*/|/|b/some/dir/file.mp3 替换为 b/file.mp3
    3. s|/.*.\.| |pa file.xls 替换为 a xls,如果 s///p 成功,那么它也会打印为标准out,(以避免没有扩展名的文件)。
    4. d 删除该行(以避免打印匹配(再次)或不匹配的行)。
  • 排序 | uniq -ic 统计每组扩展名和目录名。

  • sort -b -k2,2 -k1,1rn 首先按目录(字段 2)排序,小 -> 大,然后按倒序按计数(字段 1)排序 (大 ->小)和数字。 -b 使 sort(1) 忽略空格(空格/制表符)。

  • awk 的最后一部分漂亮地打印了输出,也许您想将其放入单独的脚本中。

如果您想查看每个管道如何过滤结果,只需尝试删除每个管道,您将看到输出。

在这里你可以找到关于 sh/awk/sed 等的很好的教程。

http://www.grymoire.com/Unix/

关于linux - 对所有目录进行文件类型统计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14634459/

相关文章:

linux - echo 不在 bash 中打印变量

bash - 输出 'cat' 以查找具有部分文件名的文件

linux - 递归文件移动

linux - 用多行文本替换单行

linux - 如何在 mprotect 处理程序中获取当前程序计数器并更新它

linux - 使用 awk 或 sed 的特定数据格式化

java - 使用数组时显示计数

mysql - mysql 查询中计数不同的原因是什么?

mysql - 在任何 1 小时的时间间隔内选择计数 > 1 的数据

linux - AWS Greengrass 守护程序无法在 Amazon Linux 中启动