Nous avons une application PHP et nous voulons compter toutes les lignes de code sous un répertoire spécifique et ses sous-répertoires. Nous n'avons pas besoin d'ignorer les commentaires, car nous essayons simplement d'avoir une idée approximative.
wc -l *.php
Cette commande fonctionne très bien dans un répertoire donné, mais ignore les sous-répertoires. Je pensais que cela pourrait fonctionner, mais il revient 74, ce qui n'est certainement pas le cas ...
find . -name '*.php' | wc -l
Quelle est la syntaxe correcte pour alimenter tous les fichiers?
find . -name '*.php' -o -name '*.inc' | xargs wc -l
wc
sera exécuté plusieurs fois. Ne gère pas non plus de nombreux noms de fichiers spéciaux.find . -name "*.php" -not -path "./tests*" | xargs wc -l
Pour un autre doublure:
fonctionne sur les noms avec des espaces, ne produit qu'un seul nombre.
la source
man find
.. print0 avec xargs -0 vous permet d'opérer sur des fichiers qui ont des espaces ou d'autres caractères étranges en leur nom( find . \( -name '*.h' -o -name '*.cpp' \) -print0 | xargs -0 cat ) | wc -l
Si vous utilisez une version décemment récente de Bash (ou ZSH), c'est beaucoup plus simple:
Dans le shell Bash, cela nécessite que l'
globstar
option soit définie, sinon l'**
opérateur glob n'est pas récursif. Pour activer ce paramètre, émettezPour le rendre permanent, ajoutez-le à l'un des fichiers d'initialisation (
~/.bashrc
,~/.bash_profile
etc.).la source
globstar
être défini pour que cela fonctionne.wc -l **/*.[ch]
trouve un total de 15195373 lignes. Je ne sais pas si vous considérez que c'est une "très faible valeur". Encore une fois, vous devez vous assurer que vous avezglobstar
activé dans Bash. Vous pouvez vérifier avecshopt globstar
. Pour l'activer explicitement, faitesshopt -s globstar
.ARG_MAX
si vous avez un grand nombre de.php
fichiers, car ellewc
n'est pas intégrée.find
contiennent des espaces. Cela pourrait être fixé à l'aideprint0
et--null
lesfind
et lesxargs
appels, respectivement.Vous pouvez utiliser l'
cloc
utilitaire conçu à cet effet précis. Il indique à chacun le nombre de lignes dans chaque langue, ainsi que le nombre de commentaires, etc. CLOC est disponible sur Linux, Mac et Windows.Exemple d'utilisation et de sortie:
la source
cloc
s'agit d'une plateforme multiplateforme puisqu'il ne s'agit que d'un script Perl?Sur les systèmes de type UNIX, il existe un outil appelé
cloc
qui fournit des statistiques de code.Je suis tombé sur un répertoire aléatoire dans notre base de code, il dit:
la source
choco install cloc
Vous n'avez pas spécifié le nombre de fichiers ou la sortie souhaitée. Est-ce ce que vous recherchez:
la source
go () { mkdir /tmp/go; [[ -f ./"$1" ]] && mv ./"$1" /tmp/go; (find ./ -type f -name "$*" -print0 | xargs -0 cat ) | wc -l; wc -l /tmp/go/*; mv /tmp/go/* . }
résultats ont été près de slocount pour*.py
, mais il ne le savais pas*.js
,*.html
.Encore une autre variation :)
Modifier: cela donnera la somme totale, au lieu de fichier par fichier.
Edit2: Ajouter
.
aprèsfind
pour le faire fonctionnerla source
$ find -name \*\.php -print0 | xargs -0 cat | wc -l
find . -name '*.php' | xargs cat | wc -l
... alors que cela donne fichier par fichier et un grand total:find . -name '*.php' | xargs wc -l
Étonnamment, il n'y a pas de réponse basée sur les trouvailles
-exec
etawk
. Et c'est parti:Cet extrait trouve pour tous les fichiers (
-type f
). Pour rechercher par extension de fichier, utilisez-name
:la source
find . -name '*.c' -print0 |xargs -0 wc -l
. Cela dit, cette méthode plus rapide (au moins sur OS X), finit par imprimer "total" plusieurs fois, donc un filtrage supplémentaire est nécessaire pour obtenir un total correct (j'ai publié des détails dans ma réponse).wc
sur une forme decat
est lent car le système doit d'abord traiter tous les Go pour commencer à compter les lignes (testé avec 200 Go de jsons, 12k fichiers). faire d'wc
abord puis compter le résultat est beaucoup plus rapidefind . -type f -exec wc -l {} \+
oufind . -name '*.py' -type f -exec wc -l {} \+
qui imprime un total à la fin de la sortie. Si tout ce qui vous intéresse est le total, vous pouvez aller un peu plus loin et utilisertail
:find . -type f -exec wc -l {} \+ | tail -1
oufind . -name '*.py' -type f -exec wc -l {} \+ | tail -1
Plus commun et simple que pour moi, supposons que vous ayez besoin de compter les fichiers de différentes extensions de nom (disons, aussi natifs)
Merci pour le retour, je l'ai corrigé.
la source
$()
POSIX
Contrairement à la plupart des autres réponses ici, celles-ci fonctionnent sur n'importe quel système POSIX, pour n'importe quel nombre de fichiers et avec n'importe quel nom de fichier (sauf indication contraire).
Lignes dans chaque fichier:
Lignes dans chaque fichier, triées par chemin de fichier
Lignes dans chaque fichier, triées par nombre de lignes, décroissantes
Nombre total de lignes dans tous les fichiers
la source
Il existe un petit outil appelé sloccount pour compter les lignes de code dans le répertoire. Il convient de noter qu'il fait plus que vous le souhaitez car il ignore les lignes / commentaires vides, regroupe les résultats par langage de programmation et calcule des statistiques.
la source
Ce que vous voulez, c'est une simple
for
boucle:la source
xargs
?IFS=$'\n'
avant la boucle le corrigerait au moins pour tous, sauf les fichiers avec des retours à la ligne dans leurs noms. Deuxièmement, vous ne citez pas'*.php'
, il sera donc développé par le shell et nonfind
, et ergo ne trouvera en fait aucun des fichiers php dans les sous-répertoires. Le-print
est également redondant, car il est implicite en l'absence d'autres actions.pour les sources uniquement:
pour filtrer, utilisez simplement grep
la source
Un simple qui sera rapide, utilisera toute la puissance de recherche / filtrage de
find
, n'échouera pas quand il y a trop de fichiers (débordements d'arguments numériques), fonctionne correctement avec des fichiers avec des symboles amusants en leur nom, sans utiliserxargs
, ne lancera pas un nombre inutilement élevé de commandes externes (grâce à+
defind
l »-exec
). Voici:la source
\;
au lieu de+
comme je ne le savais pas), cette réponse devrait être la bonne réponse.Je sais que la question est étiquetée comme frapper, mais il semble que le problème que vous essayez de résoudre soit également lié à PHP.
Sebastian Bergmann a écrit un outil appelé PHPLOC qui fait ce que vous voulez et en plus de cela, vous donne un aperçu de la complexité d'un projet. Voici un exemple de son rapport:
Comme vous pouvez le voir, les informations fournies sont beaucoup plus utiles du point de vue d'un développeur, car elles peuvent vous dire à peu près à quel point un projet est complexe avant de commencer à travailler avec lui.
la source
Je suppose que personne ne verra jamais cela enfoui à l'arrière ... Pourtant, aucune des réponses n'a jusqu'à présent abordé le problème des noms de fichiers avec des espaces. De plus, toutes ces utilisations
xargs
sont susceptibles d'échouer si la longueur totale des chemins dans l'arborescence dépasse la limite de taille de l'environnement shell (par défaut, quelques mégaoctets sous Linux). En voici un qui résout ces problèmes de manière assez directe. Le sous-shell s'occupe des fichiers avec des espaces. Leawk
total du flux dewc
sorties de fichiers individuels , ne doit donc jamais manquer d'espace. Il limite également lesexec
fichiers uniquement (en ignorant les répertoires):la source
wc -l? Faux! La commande wc compte les nouveaux codes de lignes, pas les lignes! Lorsque la dernière ligne du fichier ne se termine pas avec un nouveau code de ligne, cela ne comptera pas!
si vous voulez toujours compter les lignes, utilisez grep -c ^ , exemple complet:
enfin, attention au piège wc -l (le nombre entre, pas les lignes !!!)
la source
grep -c ^
vous comptez le nombre de lignes incomplètes , et ces lignes incomplètes ne peuvent pas apparaître dans un fichier texte .find -type f -name '*.php' -print0 | xargs -0 grep -ch ^ | paste -sd+ - | bc
voir ici pour des alternatives àbc
: stackoverflow.com/q/926069/2400328très simplement
la source
Si vous voulez que vos résultats soient triés par nombre de lignes, vous pouvez simplement ajouter
| sort
ou| sort -r
(-r
pour l'ordre décroissant) à la première réponse, comme ceci:la source
xargs wc -l
est numérique, il faudrait en fait utilisersort -n
ousort -nr
.Pour Windows , LocMetrics est un outil simple et rapide .
la source
Quelque chose de différent:
Cela fonctionne très bien, mais vous devez avoir au moins un
*.php
fichier dans le dossier en cours ou l'un de ses sous-dossiers, sinon deswc
décrochagesla source
Si vous êtes sous Linux (et je suppose que vous l'êtes), je recommande mon outil polyglotte . Il est considérablement plus rapide que l'un
sloccount
ou l' autrecloc
et il est plus fonctionnel quesloccount
.Vous pouvez l'invoquer avec
ou
il est donc beaucoup plus convivial que certains scripts bash alambiqués.
la source
C'est très simple avec les globes zsh:
Si vous utilisez bash, il vous suffit de mettre à niveau. Il n'y a absolument aucune raison d'utiliser bash.
la source
L'outil Tokei affiche des statistiques sur le code dans un répertoire. Tokei affichera le nombre de fichiers, le nombre total de lignes dans ces fichiers et le code, les commentaires et les espaces groupés par langue. Tokei est également disponible sur Mac, Linux et Windows.
Un exemple de la sortie de Tokei est le suivant:
Tokei peut être installé en suivant les instructions du fichier README dans le référentiel .
la source
Si vous n'avez besoin que du nombre total de lignes dans, disons vos fichiers PHP, vous pouvez utiliser une commande d'une ligne très simple même sous Windows si vous avez installé GnuWin32. Comme ça:
Vous devez spécifier où se trouve exactement le find.exe sinon le FIND.EXE fourni par Windows (à partir des anciennes commandes de type DOS) sera exécuté, car il est probablement avant le GnuWin32 dans le PATH de l'environnement, et a des paramètres et des résultats différents.
Veuillez noter que dans la commande ci-dessus, vous devez utiliser des guillemets, pas des guillemets simples.
la source
Donner d'abord les fichiers les plus longs (c.-à-d. Peut-être que ces longs fichiers ont besoin d'un peu de refactoring?), Et exclure certains répertoires de fournisseurs:
la source
Si vous voulez rester simple, découpez l'intermédiaire et appelez simplement
wc
avec tous les noms de fichiers:Ou dans la syntaxe moderne:
Fonctionne tant qu'il n'y a aucun espace dans les noms de répertoire ou les noms de fichiers. Et tant que vous n'avez pas des dizaines de milliers de fichiers (les shells modernes prennent en charge de très longues lignes de commande). Votre projet contient 74 fichiers, vous avez donc beaucoup d'espace pour vous développer.
la source
wc -l `find . -type f \( -name "*.cpp" -o -name "*.c" -o -name "*.h" \) -print`
Vous n'avez pas besoin de toutes ces commandes compliquées et difficiles à mémoriser. Vous avez juste besoin d'un outil appelé compteur de lignes .
Un aperçu rapide
Voici comment vous obtenez l'outil
Utilisez la
line
commande pour obtenir le nombre de fichiers et le nombre de lignes dans le répertoire actuel (récursivement)Si vous voulez plus de détails, utilisez simplement
line -d
.Et la meilleure partie de cet outil est que vous pouvez y ajouter
.gitignore
un fichier de configuration similaire. Vous pouvez définir des règles pour sélectionner ou ignorer le type de fichiers à compter, tout comme ce que vous faites dans «.gitignore».Plus de description et d'utilisation sont ici: https://github.com/MorganZhang100/line-counter
la source
Si les fichiers sont trop nombreux, mieux vaut simplement rechercher le nombre total de lignes.
la source
Sur OS X au moins, les commandes find + xarg + wc répertoriées dans certaines des autres réponses impriment plusieurs fois "total" sur de grandes listes, et aucun total complet n'est donné. J'ai pu obtenir un total unique pour les fichiers .c en utilisant la commande suivante:
find . -name '*.c' -print0 |xargs -0 wc -l|grep -v total|awk '{ sum += $1; } END { print "SUM: " sum; }'
la source