在Linux机器上,我希望遍历一个文件夹层次结构,并获得其中所有不同文件扩展名的列表。

从外壳中实现这一点的最佳方法是什么?


当前回答

不需要管道排序,awk可以做所有的事情:

find . -type f | awk -F. '!a[$NF]++{print $NF}'

其他回答

我的无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 -exec sh -c 'echo "${0##*.}"' {} \; | sort | uniq -c

因为已经有了另一个使用Perl的解决方案:

如果你安装了Python,你还可以这样做(从shell):

python -c "import os;e=set();[[e.add(os.path.splitext(f)[-1]) for f in fn]for _,_,fn in os.walk('/home')];print '\n'.join(e)"

找到每一个点,只显示后缀。

find . -type f -name "*.*" | awk -F. '{print $NF}' | sort -u

如果你知道所有后缀有3个字符,那么

find . -type f -name "*.???" | awk -F. '{print $NF}' | sort -u

或使用sed显示所有1到4个字符的后缀。将{1,4}更改为您希望在后缀中使用的字符范围。

find . -type f | sed -n 's/.*\.\(.\{1,4\}\)$/\1/p'| 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