2011-02-14 3 views

cevap

38

nasıl bu konuda:

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

Eğer Bash 4+

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

Ruby kullanıyorsanız (1.9+)

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

Yine find kullanılarak başka bir çözüm (bile gerektiği gömülü newlines ile dosya uzantılarını doğru şekilde sıralayın):

# [^.]: 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 

Ayrıca Mac üzerinde çalışır.

0

Boooom başka:

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

'echo 'gniourf.tar.gz': Sanmıyorum ya uzantıları olmadan dosyaları içerir awk -F. {'print $ 2'} '' tar 've' echo 'one.two.three.pdf' verir | awk -F. {'print $ 2'} '' iki 'yazdı. Yaklaşımının iyi olduğundan emin misin? –

+0

Yukarıdaki çözümün basit bir çözüm olduğunu düşünüyorum, burada bir başka buldum. -type f -name "*. *" | awk -F. '! a [$ NF] ++ {print $ NF}'. Basit bir komutla düşünemiyorum, her türlü dosyayı alamazsın. Daha önce de söylediğin gibi, her satırı ayrıştıran bazı problemler vardır, bu yüzden bu problemin olmayacağı python, perl veya benzeri bazı betiklerin kullanılması daha doğru olacaktır. Her neyse basit bir çözüm koydum, eğer şimdi dosya uzantılarını grep ile filtreleyebilirsiniz gibi | grep 'txt \ | png \ | pdf'. Teşekkürler – ackuser

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

Güncelleme: Matthew doğrudur. İyi bir cevap için Google'da arama gibi sadece çabuk bu çalışıyordum

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

+1

Bunun iki sorunu var. İlk önce sadece düz bir dizin için çalışır, ancak alt dizinleri özler. İkinci olarak, çıktıda uzantıları olmayan tüm dosyaları içerir. – Matthew

+0

[Özellikle ls' çıkışını ayrıştırmayın] (http://mywiki.wooledge.org/ParsingLs), özellikle de işe yaramazsa. –

0

: Yorumlarınız dayanarak, burada güncelleştirilmiş bir sürümüdür. Ben daha çok Regex Bash'den daha eğimlidir, ama bu aynı zamanda alt dizinler için de çalışır. |

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

+0

[ls' çıkışını ayrıştırmayın] (http://mywiki.wooledge.org/ParsingLs), özellikle de işe yaramazsa. –