我有一个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完成此操作?
答案 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'
s|^\./\([^/]*\)/.*/|\1 |
将./a/file.xls
替换为a/file.xls
。s|/.*/|/|
将b/some/dir/file.mp3
替换为b/file.mp3
。s|/.*.\.| |p
将a file.xls
替换为a xls
,如果s///p
成功,则它也会打印到标准输出,(以避免没有扩展名的文件)。d
删除该行(以避免打印匹配(再次)或不匹配的行)。 sort | uniq -ic
计算每组扩展名和目录名。
sort -b -k2,2 -k1,1rn
首先按目录排序(字段2),小 - >大,然后按计数(字段1)以相反的顺序(大 - >小)和数字。 -b
使sort(1)
忽略空格(空格/制表符)。
最后一个awk部分非常打印输出,也许你想把它放到一个单独的脚本中。
如果您想查看每个管道如何过滤结果,只需尝试删除每个管道,您将看到输出。
在这里你可以找到关于sh / awk / sed等的好教程。