Forum Astuces.divers [Terminal] Compter le nombre de fichiers par extension dans un répertoire

Posté par  .
Étiquettes : aucune
0
21
déc.
2005
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  (site web personnel) . Évalué à 2.

    Le premier sed doit pouvoir être amélioré.

    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  . Évalué à 2.

    avec un résultat similaire à la tienne :

    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.