我有一个 bash 脚本,可以递归地计算过去 45 天内编辑过的所有目录中的文件数
find . -type f -mtime -45| rev | cut -d . -f1 | rev | sort | uniq -ic | sort -rn
我有一个名为
的目录\parent
在 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 完成此操作?
最佳答案
将其放入脚本中,使其可执行: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
成功,那么它也会打印为标准out,(以避免没有扩展名的文件)。d
删除该行(以避免打印匹配(再次)或不匹配的行)。
排序 | uniq -ic
统计每组扩展名和目录名。sort -b -k2,2 -k1,1rn
首先按目录(字段 2)排序,小 -> 大,然后按倒序按计数(字段 1)排序 (大 ->小)和数字。-b
使sort(1)
忽略空格(空格/制表符)。awk 的最后一部分漂亮地打印了输出,也许您想将其放入单独的脚本中。
如果您想查看每个管道如何过滤结果,只需尝试删除每个管道,您将看到输出。
在这里你可以找到关于 sh/awk/sed 等的很好的教程。
关于linux - 对所有目录进行文件类型统计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14634459/