在Linux机器上,我希望遍历一个文件夹层次结构,并获得其中所有不同文件扩展名的列表。
从外壳中实现这一点的最佳方法是什么?
在Linux机器上,我希望遍历一个文件夹层次结构,并获得其中所有不同文件扩展名的列表。
从外壳中实现这一点的最佳方法是什么?
当前回答
我想这个还没有被提到:
find . -type f -exec sh -c 'echo "${0##*.}"' {} \; | sort | uniq -c
其他回答
我认为最简单直接的方法是
for f in *.*; do echo "${f##*.}"; done | sort -u
它是根据克里斯托夫的第三种方法改进的。
接受的答案使用REGEX,你不能用REGEX创建别名命令,你必须把它放在一个shell脚本中,我使用亚马逊Linux 2,并做了以下工作:
我把接受的答案代码放入一个文件,使用: Sudo vim find.sh
添加以下代码:
find ./ -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
输入::wq保存文件。
Sudo vim ~/.bash_profile 别名getext = "。/道路/ /你/ find.sh” : wq ! . ~ / . bash_profile
我的无awk、无sed、无perl、无python的posix兼容替代方案:
find . -type f | rev | cut -d. -f1 | rev | tr '[:upper:]' '[:lower:]' | sort | uniq --count | sort -rn
诀窍在于它将行反转,并在开始处切断扩展。 它还将扩展名转换为小写。
示例输出:
3689 jpg
1036 png
610 mp4
90 webm
90 mkv
57 mov
12 avi
10 txt
3 zip
2 ogv
1 xcf
1 trashinfo
1 sh
1 m4v
1 jpeg
1 ini
1 gqv
1 gcs
1 dv
试试这个(不确定是不是最好的方法,但确实有效):
find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
它的工作原理如下:
找到当前文件夹中的所有文件 打印文件扩展名(如果有的话) 制作一个唯一的排序列表
加入我自己的变化。我认为这是最简单的,当效率不是一个大问题的时候,它是有用的。
find . -type f | grep -oE '\.(\w+)$' | sort -u