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

时间:2013-01-31 20:23:45

标签: linux bash count

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

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

我有一个名为

的目录
\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完成此操作?

1 个答案:

答案 0 :(得分: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 }'
  • 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成功,则它也会打印到标准输出,(以避免没有扩展名的文件)。
    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/