Bir dizinde bulunan dosyalar için tüm benzersiz uzantıları listele


12

Belirli bir dizinde bulunan dosyaların tüm benzersiz uzantılarını görmek istiyorum. Bunu bash'da yapmanın emri nedir?

Bir kullanabilirsiniz find . -type fsonra onu uzantıyı soymak ve boru, geçerli dizindeki tüm dosyaları almak için uniq. Uzantıyı kaldırmanın en kolay yolu nedir?

Yanıtlar:


16

Bunu dene:

find . -type f | sed -rn 's|.*/[^/]+\.([^/.]+)$|\1|p' | sort -u

Şunun için hiçbir şey çıktı:

  • Uzantısı olmayan dosyalar
  • Nokta ile biten isimler içeren dosyalar
  • Gizlenmiş dosyalar

Ayrıca boruya bağlamak da yararlı olabilir sort | uniq -c.


Mac bilgisayarımdaki varsayılan sed ile çalışmıyor. Anladımsed: illegal option -- r
dzhelil

8
@ celil: OS X -Eyerine kullanın -r.
sonraki duyuruya kadar duraklatıldı.

3
find . -type f | sed -E 's/.+[\./]([^/\.]+)/\1/' | sort -u

Uzantısı olmayan dosyalar dışında OS X üzerinde çalışır. İndirilenlerim klasörü:

DS_Store
dmg
exe
localized
msi
nib
plist
pmproj
rar
tgz
txt
webloc
zip

Bunun sed -ryerine ihtiyacınız olabilir mi?


Küçük sorun: Uzantısı olmayan dosyalar adlarını yazdırır. Gizli dosyalar (örneğin .DS_Store) önde gelmeden adlarını yazdırır ..


Ben tavsiye ederim sort -uyerine sort | uniq. Daha az çatal ve kaynak kullanımı.
John T

Teşekkürler @ John. Celil'in "çerçevesi" içinde kalmaya çalıştım, bu yüzden düşünmedim.
Daniel Beck

İçerideki bir noktadan kaçmak gerekli değildir [].
sonraki duyuruya kadar duraklatıldı.

3

Aşağıda, gömülü yeni satırlar içeren dosya adlarıyla karıştırılmayan ve gömülü yeni satırlara sort -uzsahip olabilecek dosya uzantılarını doğru bir şekilde sıralamak için kullanılan başka bir çözüm daha vardır :

# [^.]: exclude dotfiles
find . -type f -name "[^.]*.*" -exec bash -c '
   printf "%s\000" "${@##*.}" # get the extensions and nul-terminate each of them
' argv0 '{}' + |
sort -uz | 
tr '\0' '\n' | 
nl

3

Uzantıyı soymanın hızlı ve kolay hatırlanabilir bir yolu, tüm dosya adlarının "name.ext" biçimine sahip olduğunu varsaymaktır:

 ls -1 | cut -d"." -f2- | sort | uniq -c

bu, kaç tane benzersiz uzantı olduğunu gösterir, örneğin:

   1 sh  
   3 txt  
   4 txt.Z  
  17 dat  
  72 dat.gz  

1

bakın, bu yüzden awk'i seviyorum:

find . -type f | awk -F "." '{ print $(NF) }' | sort -u
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.