find -name "*.*" |sed 's/.*\.//g' | sort | uniq -c |sort -n > result.txt && sed 's/^[[:blank:]]*//g' result.txt > /tmp/temp.txt && mv -f /tmp/temp.txt result.txt && sed 's/ /,/g' result.txt > /tmp/temp.txt && mv -f /tmp/temp.txt result.txt
Le premier sed doit pouvoir être amélioré.
# Plus simple:
Posté par Jérôme Pinot (site web personnel) . Évalué à 2.
Moi c'est surtout les commandes qui suivent que je trouve un peu lourdes. Voila plus simple et un peu plus elegant:
find . -name "*.*"|sed 's/.*\.//g'|sort|uniq -c|sort -nr|gawk 'OFS="\t" {print $1,$2}' > result.txt
NB: l'option -i de sed t'eviterait de travailler sur 2 fichiers...
# Une version avec Perl...
Posté par Arthur Accroc . Évalué à 2.
find . -name '*.*' | perl -nle 's/^.*\.//; ++$n{$_}; END { foreach (sort { $n{$a} <=> $n{$b} || $a cmp $b } keys(%n)) { print "$n{$_},$_" } }' > result.txt
ou à celle de Jérôme (c'est-à-dire en affichant dans l'ordre décroissant des fréquences et avec une tabulation comme séparateur), mais en gardant l'ordre alphabétique pour les extensions ayant une même fréquence :
find . -name '*.*' | perl -nle 's/^.*\.//; ++$n{$_}; END { foreach (sort { $n{$b} <=> $n{$a} || $a cmp $b } keys(%n)) { print "$n{$_}\t$_" } }' > result.txt
ou encore une variante transformant en minuscules les extensions qui n'y sont pas :
find . -name '*.*' | perl -nle 's/^.*\.//; ++$n{lc($_)}; END { foreach (sort { $n{$b} <=> $n{$a} || $a cmp $b } keys(%n)) { print "$n{$_}\t$_" } }' > result.txt
« Le fascisme c’est la gangrène, à Santiago comme à Paris. » — Renaud, Hexagone
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.