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

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


当前回答

我认为最简单直接的方法是

for f in *.*; do echo "${f##*.}"; done | sort -u

它是根据克里斯托夫的第三种方法改进的。

其他回答

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

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

加入我自己的变化。我认为这是最简单的,当效率不是一个大问题的时候,它是有用的。

find . -type f | grep -oE '\.(\w+)$' | sort -u

到目前为止,没有一个回复正确地处理带有换行符的文件名(除了ChristopheD的,它是在我输入这篇文章时出现的)。下面不是一个shell一行程序,但是可以工作,并且相当快。

import os, sys

def names(roots):
    for root in roots:
        for a, b, basenames in os.walk(root):
            for basename in basenames:
                yield basename

sufs = set(os.path.splitext(x)[1] for x in names(sys.argv[1:]))
for suf in sufs:
    if suf:
        print suf

Powershell:

dir -recurse | select-object extension -unique

感谢http://kevin-berridge.blogspot.com/2007/11/windows-powershell.html

试试这个(不确定是不是最好的方法,但确实有效):

find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u

它的工作原理如下:

找到当前文件夹中的所有文件 打印文件扩展名(如果有的话) 制作一个唯一的排序列表