Dapatkan semua ekstensi dan jumlah file masing-masing dalam direktori

14

Mendapatkan semua ekstensi untuk direktori: mudah. Mendapatkan jumlah file untuk ekstensi tertentu: mudah.

Tetapi mendapatkan semua ekstensi file dan jumlah file masing-masing menyinggung saya.

misalnya.

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

harus mengembalikan sesuatu seperti:

.txt 2
.pdf 1
.pov 1

Tujuan dari latihan ini adalah saya ingin mengetahui ekstensi file mana yang populer di direktori tertentu.

Terima kasih sebelumnya

denormalizer
sumber

Jawaban:

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

Berikut penjelasannya:

find ./ -type f

temukan hanya file, bukan direktori

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

filter file dengan ekstensi

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

hapus path dan nama file, simpan hanya ekstensi

sort | uniq -c | sort -n

sort, uniq dan sort

bindbn
sumber
Anda dapat membuat regex Anda mengizinkan lebih banyak karakter dalam ekstensi dan menghilangkannya grepdengan melakukan ini:sed -ne '/\.[^./]*$/s/.*\(\.[^.]*\)$/\1/p'
Dijeda hingga pemberitahuan lebih lanjut.
Dennis, mengganti grep dan sed dengan sed Anda mengembalikan kesalahan berikut: sed: -e ekspresi # 1, char 30: referensi tidak valid \ 1 pada RHS perintah `s '
denormalizer
2

Karena Anda menggunakan Linux (gnu grep), ini adalah saat yang tepat untuk menggunakan Perl REs (PCRE) -Pdan -oopsi grep . Mengambil jawaban @ bindbn sebagai kandidat yang hebat:

find . -type f | grep -Po '\.([\w\d])*$' | sort | uniq -c | sort -n
Jim
sumber