Ottieni tutte le estensioni e il rispettivo conteggio dei file in una directory


14

Ottenere tutte le estensioni per una directory: facile. Ottenere i conteggi dei file per una determinata estensione: facile.

Ma ottenere tutte le estensioni di file e il rispettivo numero di file mi allude.

per esempio.

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

dovrebbe restituire qualcosa del tipo:

.txt 2
.pdf 1
.pov 1

Lo scopo di questo esercizio è che voglio scoprire quale estensione di file è popolare in una determinata directory.

Grazie in anticipo

Risposte:


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

Ecco la spiegazione:

find ./ -type f

trova solo file, non directory

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

filtra file con estensione

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

elimina percorso e nome file, salva solo l'estensione

sort | uniq -c | sort -n

ordina, uniq e ordina


Puoi fare in modo che il tuo regex consenta più caratteri nell'estensione ed eliminarlo grepin questo modo:sed -ne '/\.[^./]*$/s/.*\(\.[^.]*\)$/\1/p'
Sospeso fino a nuovo avviso.

Dennis, sostituendo grep e sed con la tua sed restituisce il seguente errore: sed: -e espressione # 1, carattere 30: riferimento non valido \ 1 su RHS del comando `s '
denormalizer

2

Dato che stai usando Linux (gnu grep), questo è un buon momento per usare Perl REs (PCRE) -Pe l' -oopzione grep . Prendendo la risposta di @ bindbn come un ottimo candidato:

find . -type f | grep -Po '\.([\w\d])*$' | sort | uniq -c | sort -n
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.