En Bash, comment puis-je compter le nombre de lignes de code non vides dans un projet ?
Pas sûr pourquoi vous utilisez cat là-bas. Utilisez foo.c ou foo.pl comme nom de fichier à passer à sed. sed '/^\s*$/d' foo.c | wc -l
En Bash, comment puis-je compter le nombre de lignes de code non vides dans un projet ?
Pas sûr pourquoi vous utilisez cat là-bas. Utilisez foo.c ou foo.pl comme nom de fichier à passer à sed. sed '/^\s*$/d' foo.c | wc -l
C'est juste une habitude. Je lis les pipelines de gauche à droite, ce qui signifie que je commence généralement par cat, puis action, action, action, etc. Clairement, le résultat final est le même.
Pour effectuer ceci pour tous les fichiers dans tous les sous-dossiers et exclure les commentaires avec '//', étendez cette commande comme suit : find . -type f -name '*.c' -exec cat {} \; | sed '/^\s*#/d;/^\s*$/d;/^\s*\/\//d' | wc -l
#!/bin/bash
trouver . -path './pma' -prune -o -path './blog' -prune -o -path './punbb' -prune -o -path './js/3rdparty' -prune -o -print | egrep '\.php|\.as|\.sql|\.css|\.js' | grep -v '\.svn' | xargs cat | sed '/^\s*$/d' | wc -l
Le code ci-dessus vous donnera le nombre total de lignes de code (lignes vides supprimées) pour un projet (dossier actuel et tous les sous-dossiers de manière récursive).
Dans le code ci-dessus, les dossiers "./blog", "./punbb", "./js/3rdparty" et "./pma" sont des dossiers que j'ai mis sur liste noire car je n'ai pas écrit le code à l'intérieur. De plus, les extensions des fichiers examinés sont .php, .as, .sql, .css, .js. Tous les fichiers avec une extension différente sont ignorés.
Variation pour une application Rails : find . -path './log' -prune -o -path './trunk' -prune -o -path './branches' -prune -o -path './vendor' -prune -o -path './tmp' -prune -o -print | egrep '\.rb|\.erb|\.css|\.js|\.yml' | grep -v 'svn' | xargs cat | sed '/^\s*$/d' | wc -l
Il existe de nombreuses façons de le faire, en utilisant des utilitaires shell courants.
Ma solution est :
grep -cve '^\s*$'
Cela cherche les lignes dans qui ne correspondent pas (-v) aux lignes qui correspondent au motif (-e) '^\s*$', qui est le début d'une ligne, suivi de 0 ou plusieurs caractères d'espacement, suivi de la fin d'une ligne (c'est-à-dire pas de contenu autre que des espaces), et affiche un décompte des lignes correspondantes (-c) au lieu des lignes correspondantes elles-mêmes.
Un avantage de cette méthode par rapport aux méthodes impliquant un passage par le biais de wc
, est que vous pouvez spécifier plusieurs fichiers et obtenir un décompte séparé pour chaque fichier :
$ grep -cve '^\s*$' *.hh
config.hh:36
exceptions.hh:48
layer.hh:52
main.hh:39
Si vous souhaitez utiliser autre chose qu'un script shell, essayez CLOC:
cloc comptabilise les lignes vides, les lignes de commentaire et les lignes physiques de code source dans de nombreux langages de programmation. Il est entièrement écrit en Perl sans aucune dépendance extérieure à la distribution standard de Perl v5.6 et supérieure (le code de certains modules externes est intégré dans cloc) et est donc assez portable.
Lorsque j'ai posé cette question pour la première fois, 'cloc' comptait les docstrings Python comme des lignes de code, ce qui était suboptimal à mon avis. Les versions modernes de 'cloc' comptent maintenant les docstrings Python comme des commentaires, ce que j'apprécie beaucoup plus.
'wc' compte les lignes, les mots, les caractères, donc pour compter toutes les lignes (y compris les lignes vides) utilisez :
wc *.py
Pour filtrer les lignes vides, vous pouvez utiliser grep :
grep -v '^\s*$' *.py | wc
'-v' indique à grep de renvoyer toutes les lignes sauf celles qui correspondent '^' est le début d'une ligne '\s*' est zéro ou plusieurs caractères d'espacement '$' est la fin d'une ligne *.py est mon exemple pour tous les fichiers que vous souhaitez compter (tous les fichiers python dans le répertoire actuel) rediriger la sortie vers wc. C'est parti.
Je réponds à ma propre question (véritable). Je n'ai pas trouvé d'entrée sur stackoverflow qui couvrait cela.
\W n'est pas une correspondance pour l'espace blanc, il correspond aux caractères non alphabétiques. C'est l'opposé de \w, les caractères alphabétiques. \W correspondra à tout ce qui n'est pas alphanumérique ou un trait de soulignement, et ne fera donc pas ce que vous prétendez qu'il fait ici. Vous voulez dire \s
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
1 votes
Beaucoup des solutions ci-dessous fonctionnent seulement pour un fichier (par exemple,
foo.c
). Des réflexions sur le nombre total de lignes dans un projet (par exemple, de nombreux fichiers dans une structure de répertoire, à l'exception des fichiers binaires) ?6 votes
@solvingPuzzles Je pense que je peux répondre à cette partie. Pour toute solution qui fonctionne sur un fichier, par exemple "cat FILE | sed blah", vous pouvez travailler sur de nombreux fichiers en remplaçant le "cat FILE" par une commande qui répertorie les noms de fichiers sur lesquels opérer, par exemple "find . -name '*.py'", et en redirigeant cela vers "xargs cat". Par exemple, "find . -name '*.py' | xargs cat | sed '/^\s*$/d' | wc -l"
2 votes
@JonathanHartley @solvingPuzzles il existe également des programmes tels que
sloc
etcloc
qui sont là pour faire le décompte des lignes de code.0 votes
OP ici: Quand j'ai posé ce problème la première fois, 'cloc' n'a pas fait du bon travail sur le code Python. De nos jours, c'est génial.
0 votes
Cloc est également disponible en tant que module npm et permet de gagner beaucoup de temps.