在所有目录中执行文件类型计数

l--*_*''' 3 linux bash count

我有一个bash脚本,它给出了在过去45天内编辑的所有递归目录中的文件计数

 find . -type f -mtime -45| rev | cut -d . -f1 | rev | sort | uniq -ic | sort -rn
Run Code Online (Sandbox Code Playgroud)

我有一个名为的目录

\parent
Run Code Online (Sandbox Code Playgroud)

在父母我有:

\parent\a
\parent\b
\parent\c
Run Code Online (Sandbox Code Playgroud)

我会在文件夹上运行一次上面的脚本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
Run Code Online (Sandbox Code Playgroud)

我想从\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      |
+-------+------+--------+
Run Code Online (Sandbox Code Playgroud)

我怎样才能用bash来实现这个目标?

emi*_*mil 5

将它放入脚本中,使其可执行: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 }'
Run Code Online (Sandbox Code Playgroud)
  • sed 's|^\./\([^/]*\)/|\1/|; s|/.*/|/|; s|/.*.\.| |p; d'

    1. s|^\./\([^/]*\)/.*/|\1 |替代./a/file.xlsa/file.xls.
    2. s|/.*/|/|替代b/some/dir/file.mp3b/file.mp3.
    3. s|/.*.\.| |p替代品a file.xlsa xls,如果s///p成功,则它也打印到标准输出,(避免文件,而无需扩展名).
    4. d 删除该行(以避免打印匹配(再次)或不匹配的行).
  • sort | uniq -ic 计算每组扩展名和目录名.

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

  • 最后一个awk部分打印输出,也许你想把它放到一个单独的脚本中.

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

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

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