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

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

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的所有文件夹运行脚本,并得到这样的输出:

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

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

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

如果你想看看每个管道如何过滤结果只是尝试删除每个结果,你会看到输出。

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

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