J'ai ajouté un alias git pour me donner le nombre de lignes de fichiers spécifiques dans mon historique:
[alias]
lines = !lc() { git ls-files -z ${1} | xargs -0 wc -l; }; lc
Cependant, wc -l
rapporte plusieurs totaux, de sorte que si j'ai plus de ~ 100 000 lignes, il rapporte le total pour eux, puis passe à autre chose. Voici un exemple:
<100k lignes (sortie souhaitée)
$ git lines \*.xslt
46 packages/NUnit-2.5.10.11092/doc/files/Summary.xslt
232 packages/NUnit-2.5.10.11092/samples/csharp/_UpgradeReport_Files/UpgradeReport.xslt
278 total
> 100k lignes (devaient être acheminées vers grep "total"
)
$ git lines \*.cs | grep "total"
123569 total
107700 total
134796 total
111411 total
44600 total
Comment puis-je obtenir un vrai total wc -l
, pas une série de sous-totaux?
xargs
, nonwc
. Je suis toujours intéressé par la façon de le réparer, et je ne vois pas de bonne solution dans les réponses.wc
charge l'--files0-from
option? Ensuite, vous pouvez le faire{ git ls-files -z ${1} | wc -l --files0-from=- ; }
wc: unrecognized option '--files0-from=-'
Réponses:
Essayez ceci, et excuses pour être évident:
ou, avec git:
Si vous voulez réellement que la sortie ressemble à une
wc
sortie, avec à la fois des nombres individuels et une somme, vous pouvez utiliserawk
pour additionner les lignes individuelles:Cela ne sera pas aussi bien aligné que
wc
si cela vous importait. Pour ce faire, vous devez lire l'intégralité de l'entrée et l'enregistrer, calculer le total, puis utiliser le total pour calculer la largeur du champ avant d'utiliser cette largeur de champ pour imprimer une sortie formatée des lignes mémorisées. Comme les projets de rénovation domiciliaire, lesawk
scripts ne sont jamais vraiment terminés.(Note aux éditeurs enthousiastes: l'expression régulière dans la première
awk
condition est dans le cas où il y a un fichier dont le nom commence par "total" et un espace; sinon, la condition aurait pu être la plus simple$2 == "total"
.)la source
git ls-files -z ${1} | xargs -0 cat | wc -l
). Cependant, je manque le nombre de lignes par fichier que wc -l fournit comme dans mon premier exemple ci-dessus. Est-il possible de tirer le meilleur parti des deux mondes ici?grep -v
pour supprimer le total des lignes, et une fois comme je suggère d'obtenir le total. Ou vous pouvez essayer la solution awk dans la réponse modifiée,git ls-files -z ${1} | xargs -0 wc -l | awk '/^[[:space:]]*[[:digit:]]+[[:space:]]+total$/{next} {total+=$1;print} END {print "\n Total:",total,"lines"}'
Si vous utilisez Linux, votre
wc
vient probablement de GNU Coreutils et a une--files0-from
option pour lire un fichier (ou stdin) contenant une liste arbitrairement longue de noms de fichiers terminés par NUL à compter. La documentation de GNU Coreutils wc indique: "Ceci est utile lorsque la liste des noms de fichiers est si longue qu'elle peut dépasser une limite de longueur de ligne de commande. Dans de tels cas, l'exécution de wc via xargs n'est pas souhaitable car elle divise la liste en morceaux et fait imprimer wc un total pour chaque sous-liste plutôt que pour la liste entière. "Essayez donc ceci:
Edit: Étant donné
wc
que vous êtes du dernier millénaire et que vous n'avez pas cette option, voici une solution plus portable, en supposant que vous avezawk
et n'avez pas de fichiers nommés "total". Il filtrera la sortie dewc
, en omettant toutes lestotal
lignes et en les résumant et en imprimant le grand total à la fin.Une chose que je ne sais pas, c'est si l'
git
implémentation de l' alias aura des problèmes avec les guillemets simples$1
et$2
intérieurs, qui doivent être passés inchangésawk
.la source
xargs
etwc
vous courez sont de Cygwin? Pouvez-vous coller la sortie dewc --version
?$ wc --version wc (GNU textutils) 2.0 Written by Paul Rubin and David MacKenzie. Copyright (C) 1999 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
C:\Program Files (x86)\Git\bin\wc.exe
--files0-from
.Le problème est de savoir si
xargs
la commande est divisée en plusieurs exécutions. Lewc
rapport est donc à chaque fois généré. Vous avez quelques options, vous pouvez garder les choses telles qu'elles sont et analyser lawc
sortie:Vous pouvez attraper les fichiers:
Ou vous pouvez sauter
xargs
complètement (adapté d' ici ):Cela cassera si votre liste de fichiers est plus longue que ARG_MAX .
la source
la source