2011-02-14 65 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

相關問題