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