3

我有一个 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 做到这一点?

4

1 回答 1

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|/.*.\.| |p替换a file.xlsa xls, 如果s///p成功则它也打印到​​标准输出,(以避免没有扩展名的文件)。
    4. d删除该行(以避免打印匹配(再次)或不匹配的行)。
  • sort | uniq -ic计算每组扩展名和目录名。

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

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

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

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

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

于 2013-01-31T20:51:15.820 回答