si je veux compter les lignes de code, la chose triviale est
cat *.c *.h | wc -l
Mais que faire si j'ai plusieurs sous-répertoires?
recursive
source-code
Niklas
la source
la source
cat
?wc -l *.c *.h
fait la même chose.wc -l *.c *.h | tail -n 1
d'obtenir une sortie similaire.**
, donc vous auriez pu utiliserwc -l **/*.{h,c}
ou quelque chose de similaire. Notez que dans Bash, au moins, cette option (appeléeglobstar
) est désactivée par défaut. Mais notez également que dans ce cas particulier,cloc
ouSLOCCount
est une bien meilleure option. (En outre, ilack
peut être préférable defind
trouver / répertorier facilement les fichiers source.)Réponses:
La façon la plus simple est d'utiliser l'outil appelé
cloc
. Utilisez-le de cette façon:C'est ça. :-)
la source
Vous devriez probablement utiliser SLOCCount ou cloc pour cela, ils sont spécialement conçus pour compter les lignes de code source dans un projet, quelle que soit la structure du répertoire, etc. non plus
ou
produira un rapport sur tout le code source à partir du répertoire courant.
Si vous souhaitez utiliser
find
etwc
, GNUwc
a une belle--files0-from
option:(Merci à SnakeDoc pour la suggestion de cloc !)
la source
sloccount /tmp/stackexchange
(créée à nouveau le 17 mai après mon dernier redémarrage) indique que le coût estimé pour développer les fichiers sh, perl, awk, etc. qu'elle a trouvé est de 11 029 $. et cela n'inclut pas les one-liners qui ne l'ont jamais fait dans un fichier script.cloc
c'est bien aussi: github.com/AlDanial/clocComme la
wc
commande peut prendre plusieurs arguments, vous pouvez simplement passer tous les noms de fichiers à l'wc
aide de l'+
argument de l'-exec
action de GNUfind
:Alternativement, dans
bash
, en utilisant l'option shellglobstar
pour parcourir les répertoires de manière récursive:D'autres shells traversent récursivement par défaut (par exemple
zsh
) ou ont des options similaires commeglobstar
, enfin, au moins la plupart.la source
Vous pouvez utiliser
find
avecxargs
etwc
:la source
total
lignes si plusieurswc
s sont invoqués.)wc
problèmes de commandes peut être résolu par la tuyauteriefind
à lawhile read FILENAME; do . . .done
structure. Et à l'intérieur de la boucle whilewc -l
. Le reste résume le total des lignes dans une variable et l'affiche.Si vous êtes dans un environnement où vous n'avez pas accès à
cloc
etc, je vous suggèreTraversée:
find
recherche récursivement tous les fichiers normaux dont le nom se termine par.c
ou.h
et s'exécutecat
sur eux. La sortie est canaliséegrep
pour compter toutes les lignes non vides (celles qui contiennent au moins un caractère non espacé).la source
Comme cela a été souligné dans les commentaires,
cat file | wc -l
n'est pas équivalent àwc -l file
parce que le premier imprime uniquement un numéro tandis que le second affiche un numéro et le nom du fichier. De mêmecat * | wc -l
, imprimera juste un nombre, tandiswc -l *
qu'imprimera une ligne d'informations pour chaque fichier.Dans un esprit de simplicité, revenons à la question effectivement posée:
Tout d'abord, vous pouvez simplifier même votre commande triviale pour:
Et enfin, l'équivalent de plusieurs sous-répertoires est:
Cela pourrait peut-être être amélioré de plusieurs façons, par exemple en restreignant les fichiers correspondants aux fichiers normaux uniquement (pas aux répertoires) en ajoutant
-type f
—mais lafind
commande donnée est l' équivalent récursif exact decat *.[ch]
.la source
Échantillon en utilisant
awk
:la source
+
à la place de\;
.wc -l
pour des groupes de fichiers, un peu comme lexargs
fait le cas, mais il gère les caractères impairs (comme les espaces) dans les noms de fichiers sans avoir besoin ni des optionsxargs
(non standard)-print0
ni des-0
options defind
etxargs
respectivement. C'est une optimisation mineure. L'inconvénient serait que chaque invocation dewc
produirait un nombre total de lignes à la fin lorsque plusieurs fichiersawk
seraient fournis - le script aurait géré cela. Ce n'est donc pas un slam-dunk, mais très souvent, utiliser+
à la place de\;
avecfind
est une bonne idée.wc
. Si le nombre de fichiers qui seront trouvés a priori est inconnu , y a-t-il un risque de dépasser cette limite ou est-il géré par find?find
regroupe les fichiers en groupes de taille pratique, qui ne dépasseront pas la limite de longueur pour la liste d'arguments sur la plate-forme, permettant l'environnement (qui sort de la longueur de la liste d'arguments - donc la longueur de la liste d'arguments plus la la longueur de l'environnement doit être inférieure à une valeur maximale). IOW,find
fait le bon travail, comme lexargs
fait bien le travail.commande facile:
la source
total
lignes si plusieurswc
s sont invoqués.)Si vous êtes sous Linux, je recommande mon propre outil, polyglotte . C'est beaucoup plus rapide que
cloc
et plus fonctionnel quesloccount
.Vous devriez également pouvoir construire sur BSD, bien qu'il n'y ait pas de binaires fournis.
Vous pouvez l'invoquer avec
la source
find . -name \*.[ch] -print | xargs -n 1 wc -l
devrait faire l'affaire. Il existe également plusieurs variantes possibles, comme l'utilisation-exec
au lieu de canaliser la sortie verswc
.la source
find . -name \*.[ch] -print
n'imprime pas le contenu des fichiers, seulement les noms de fichiers. Je compte donc le nombre de fichiers à la place, non? Ai-je besoin de `xargs '?xargs
, et vous devrez également surveiller leswc
appels multiples si vous avez beaucoup de fichiers; vous devez rechercher toutes lestotal
lignes et les additionner.find . -name \*.[ch] -print0 | xargs -0 cat | wc -l
find . -name \*.[ch] -print | wc -l
) compte le nombre de fichiers (sauf si un nom de fichier contient une nouvelle ligne - mais c'est très inhabituel) - il ne compte pas le nombre de lignes dans les fichiers.