我有一个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来实现这个目标?
将它放入脚本中,使其可执行: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'
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等的好教程.
归档时间: |
|
查看次数: |
952 次 |
最近记录: |