Obtenez toutes les extensions et leur nombre de fichiers respectifs dans un répertoire

14

Obtenir toutes les extensions pour un répertoire: facile. Obtenir le nombre de fichiers pour une extension particulière: facile.

Mais obtenir toutes les extensions de fichiers et leur nombre de fichiers respectifs me fait allusion.

par exemple.

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

devrait retourner quelque chose comme:

.txt 2
.pdf 1
.pov 1

Le but de cet exercice est de savoir quelle extension de fichier est populaire dans un certain répertoire.

Merci d'avance

dénormaliseur
la source

Réponses:

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

Voici l'explication:

find ./ -type f

rechercher uniquement le fichier, pas le répertoire

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

fichier de filtre avec extension

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

supprimer le chemin et le nom de fichier, enregistrer uniquement l'extension

sort | uniq -c | sort -n

trier, uniq et trier

bindbn
la source
Vous pouvez faire en sorte que votre expression régulière autorise plus de caractères dans l'extension et les éliminer grepen procédant ainsi:sed -ne '/\.[^./]*$/s/.*\(\.[^.]*\)$/\1/p'
pause jusqu'à nouvel ordre.
Dennis, le remplacement de grep et sed par votre sed renvoie l'erreur suivante: sed: -e expression # 1, char 30: reference non valide \ 1 sur la commande RHS de `s '
dénormaliseur
2

Puisque vous utilisez Linux (gnu grep), c'est le bon moment pour utiliser Perl REs (PCRE) -Pet l' -ooption de grep . Prendre la réponse de @ bindbn comme un excellent candidat:

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