Tüm uzantıları ve ilgili dosya sayısını bir dizine alın


14

Bir dizin için tüm uzantıları alma: kolay. Belirli bir uzantı için dosya sayımlarını almak: kolay.

Ancak tüm dosya uzantılarını ve ilgili dosya sayılarını almak beni etkiliyor.

Örneğin.

+ dir
 + abc.txt
 + def.txt
 + abc.pdf
 * def.pov

şöyle bir şey döndürmelidir:

.txt 2
.pdf 1
.pov 1

Bu alıştırmanın amacı, belirli bir dizinde hangi dosya uzantısının popüler olduğunu bulmak istiyorum.

Şimdiden teşekkürler

Yanıtlar:


47
/var/cache$ sudo find ./ -type f | grep -E ".*\.[a-zA-Z0-9]*$" | sed -e 's/.*\(\.[a-zA-Z0-9]*\)$/\1/' | sort | uniq -c | sort -n
      1 .6
      1 .cache
      1 .noconf
      1 .php
      1 .sl
      2 .bin
      2 .el
      2 .tdb
      4 .baseA
      4 .baseB
      4 .dat
      4 .DB
     27 .db
    221 .deb

İşte açıklama:

find ./ -type f

dizini değil, yalnızca dosyayı bul

grep -E ".*\.[a-zA-Z0-9]*$"

uzantılı filtre dosyası

sed -e 's/.*\(\.[a-zA-Z0-9]*\)$/\1/'

yolu ve dosya adını sil, yalnızca uzantıyı kaydet

sort | uniq -c | sort -n

sıralama, uniq ve sıralama


Normal ifadenizi uzantıda daha fazla karaktere izin verebilir ve grepbunu yaparak ortadan kaldırabilirsiniz :sed -ne '/\.[^./]*$/s/.*\(\.[^.]*\)$/\1/p'
sonraki duyuruya kadar duraklatıldı.

Dennis, grep ve sed'in sed ile değiştirilmesi şu hatayı döndürür: sed: -e ifade # 1, karakter 30: `s 'komutunun
RHS'sinde

2

Linux (gnu grep) kullandığınız için, bu Perl RE'leri (PCRE) -Pve grep'in -oseçeneğini kullanmak için iyi bir zamandır . @ Bindbn'ın cevabını büyük bir aday olarak almak:

find . -type f | grep -Po '\.([\w\d])*$' | sort | uniq -c | sort -n
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.