He agregado un alias git para darme el recuento de líneas de archivos específicos en mi historial:
[alias]
lines = !lc() { git ls-files -z ${1} | xargs -0 wc -l; }; lc
Sin embargo, wc -l
informa múltiples totales, de modo que si tengo más de ~ 100k líneas, informa el total para ellos, luego continúa. Aquí hay un ejemplo:
<100k líneas (salida deseada)
$ 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 líneas (tuvieron que canalizar grep "total"
)
$ git lines \*.cs | grep "total"
123569 total
107700 total
134796 total
111411 total
44600 total
¿Cómo obtengo un total verdadero wc -l
, no una serie de subtotales?
xargs
, nowc
. Todavía estoy interesado en cómo solucionarlo, y no veo una buena solución en las respuestas.wc
admite la--files0-from
opción? Entonces puedes hacerlo{ git ls-files -z ${1} | wc -l --files0-from=- ; }
wc: unrecognized option '--files0-from=-'
Respuestas:
Prueba esto y disculpas por ser obvio:
o con git:
Si realmente desea que la salida se vea como
wc
salida, con recuentos individuales y una suma, puede usarawk
para sumar las líneas individuales:Eso no se alineará tan bien como lo
wc
hace, en caso de que le importe. Para hacer eso, necesitaría leer la entrada completa y guardarla, calcular el total y luego usar el total para calcular el ancho del campo antes de usar ese ancho de campo para imprimir una salida formateada de las líneas recordadas. Al igual que los proyectos de renovación de viviendas, losawk
guiones nunca se terminan realmente.(Nota para editores entusiastas: la expresión regular en la primera
awk
condición es en caso de que haya un archivo cuyo nombre comience con "total" y un espacio; de lo contrario, la condición podría haber sido mucho más simple$2 == "total"
).fuente
git ls-files -z ${1} | xargs -0 cat | wc -l
). Sin embargo, me falta el recuento de líneas por archivo que wc -l proporciona, como en mi primer ejemplo anterior. ¿Alguna forma de obtener lo mejor de ambos mundos aquí?grep -v
para soltar las líneas totales, y una vez que sugiero obtener el total total. O puede probar la solución awk en la respuesta editada,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 está ejecutando Linux,
wc
probablemente provenga de GNU Coreutils y tenga la--files0-from
opción de leer un archivo (o stdin) que contenga una lista arbitrariamente larga de nombres de archivo terminados en NUL para contar. La documentación de wc de GNU Coreutils dice "Esto es útil cuando la lista de nombres de archivos es tan larga que puede exceder una limitación de longitud de la línea de comando. En tales casos, ejecutar wc a través de xargs no es deseable porque divide la lista en pedazos y hace que wc se imprima un total para cada sublista en lugar de para toda la lista ".Entonces prueba esto:
Editar: dado que su
wc
es del último milenio y no tiene esa opción, aquí hay una solución más portátil, suponiendo que tengaawk
y no tenga ningún archivo llamado "total". Filtrará la salida dewc
, omitiendo lastotal
líneas y en su lugar resumiéndolas e imprimiendo el total general al final.Una cosa que no sé es si la
git
implementación del alias tendrá problemas con las comillas simples$1
y$2
dentro de ellas, que deben pasarse sin cambiosawk
.fuente
xargs
ywc
que se está ejecutando es de Cygwin? ¿Se puede pegar la salida 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
.El problema es
xargs
que está dividiendo el comando en varias ejecuciones, por lo quewc
está informando el total de cada vez. Tiene algunas opciones, puede mantener las cosas como están y analizar lawc
salida:Podrías cat los archivos:
O puede omitir por
xargs
completo (adaptado desde aquí ):Sin embargo, eso se romperá si su lista de archivos es más larga que ARG_MAX .
fuente
fuente