例如,我有一个包含不同类型文件的文件夹(.jpg,.png,.txt,..),并且想知道我的文件夹中的每个扩展名分别有多少个文件。
输出将是这样的:
.jpg : 255
.png : 123
.txt : 12
No extension : 1
目前,我只知道如何使用此命令查找一个给定扩展名存在多少个文件:
find /folderpath -type f -name '*.jpg' | wc -l
但是我希望它能够自己找到文件扩展名。
感谢您的帮助。
答案 0 :(得分:2)
您可以使用以下命令对单个目录执行此操作:
ls | grep '\.' | sed 's/.*\././' | sort | uniq -c
(我忽略了没有.
的文件 - 如果你想要别的话就调整一下)
我建议将其充实到一个脚本(例如,extension_counts
)中,该脚本会获取目录列表,并且每个目录都会以您希望的格式输出报告所遵循的路径。
快速而肮脏的版本:
#!/bin/sh
for dir in $*; do
echo $dir
(cd $dir && ls | grep '\.' | sed 's/.*\././' | sort | uniq -c)
done
......但你应该考虑强化这一点。
然后,对于递归部分,您可以使用find
和xargs
:
find . -type d | xargs extension_counts
通过将extension_counts
定义为函数,您可以更聪明地在一个脚本文件中完成所有操作,但这是一个优化。
解析ls
(或find
)的输出存在一些缺陷。在这种情况下,我能想到的唯一潜在问题是包含换行符的文件名(是的,这是可能的)。您可以接受使用非专为奇怪文件名设计的工具,或者您可以在具有更强大数据结构的语言中编写更强大的内容,例如Python,Perl,Ruby,Go等。
答案 1 :(得分:2)
这可以通过快速insert into Course(CourseID,CourseDes...
一个班轮来完成:
awk
find /folderpath -type f -name '*.*' | awk -F"." 'BEGIN{OFS=" : "}{extensions[$NF]++}END{for (ext in extensions) { print ext, extensions[ext]}};'
-F"."
BEGIN{OFS=" : "}
的文件扩展名加载数组,其中$ NF是记录中的最后一个字段。数组的值将是一个计数extensions[$NF]
。 ++
并打印出索引和值for (ext in extensions)
答案 2 :(得分:2)
我会这样做:
列出文件名(而不是find
生成的路径):
find . -type f | rev | cut -d/ -f1 | rev
我们反转每一行,以便我们可以轻松解决最后一个字段
缩小到他们的扩展名:
sed -E 's/^.*\././;t end;s/.*/No extension/;:end'
在这里我们删除第一个点的所有内容,或者如果无法完成替换(因为没有点),我们将所有内容替换为“No extension”。
对结果进行排序:
sort
按分组分组并添加计数:
uniq -c
如下所示的完整命令:
find . -type f | rev | cut -d/ -f1 | rev | sed -E 's/^.*\././;t end;s/.*/No extension/;:end' | sort | uniq -c
请注意,演示文稿与您的演示文稿不同,可以使用其他sed
轻松修复:
2 .119
1 .147
[...]
1 .Xauthority
1 .xml
1 .xsession-errors
2 .zip
1 .zshrc
48 No extension