2011-02-14 64 views

回答

38

如何:

find . -type f -name '*.*' | sed 's|.*\.||' | sort -u 
0

如果你使用bash 4+

shopt -s globstar 
for file in **/*.* 
do 
    echo "${file##*.} 
done 

红宝石(1.9+)

ruby -e 'Dir["**/*.*"].each{|x|puts x.split(".")[-1]}' | sort -u 
0

然而,使用find另一种解决方案(这应该连用正确的嵌入换行符对文件扩展名进行排序):

# [^.]: exclude dotfiles 
find . -type f -name "[^.]*.*" -exec bash -c ' 
    printf "%s\000" "${@##*.}" 
' argv0 '{}' + | 
sort -uz | 
tr '\0' '\n' 
1
find . -type f | sed 's|.*\.||' | sort -u 

也适用于Mac。

0

Boooom另:

find * | awk -F . {'print $2'} | sort -u 
+0

'回声“gniourf.tar.gz” | awk -F。 {'print $ 2'}`给出`tar`和`echo'one.two.three.pdf'| awk -F。 {'print $ 2'}`给出`two`。你确定你的方法是好的吗? – 2014-06-27 13:22:53

+0

我认为上述解决方案是一个简单的解决方案,在这里我把另一个发现。 -type f -name“*。*”| awk -F。 '!a [$ NF] ++ {print $ NF}'。我不认为用简单的命令你不能得到每一种类型的文件。正如你之前所说的那样,在解析每一行时都会遇到一些问题,所以在这种情况下,我确定最好使用python,perl或类似的脚本来处理这些问题。无论如何,我把一个简单的解决方案,如果你现在的文件扩展名,你可以使用类似grep的过滤| grep'txt \ | png \ | pdf'。谢谢 – ackuser 2014-06-30 09:20:04

0
ls -1 | sed 's/.*\.//' | sort -u 

更新: 你是正确的马修。基于您的评论,这里是一个更新版本:

ls -R1 | egrep -C 0 "[^\.]+\.[^\./:]+$" | sed 's/.*\.//' | sort -u

+1

这有两个问题。首先它只适用于平面目录,但会丢失子目录。其次,它包括输出中没有扩展名的所有文件。 – Matthew 2014-10-09 13:11:33

0

我只是想很快这个,因为我是一个很好的答案谷歌搜索。我比Bash更倾向于正则表达式,但这也适用于子目录。我不认为包括文件,无需任何扩展名:

ls -R | egrep '(\.\w+)$' -o | sort | uniq -c | sort -r

相关问题