Lo que ha empezado como un simple conteo de ficheros para ver qué proyecto hacía que Eclipse fuese lento, ha terminado en todo un contador de líneas digno de aparecer en cualquier libro de ingeniería del software (nótese la cursiva, por favor
), si no fuera porque es un script de consola bash con salida de texto simple.
Al grano:
#!/bin/bash
EXTENSIONES="$@"
ficheros_total=0
lineas_total=0
vacias_total=0
novacias_total=0
for ext in $EXTENSIONES ; do
echo EXTENSION $ext
ficheros=`find . -name "*.$ext" | wc -l`
lineas=`find . -name "*.$ext" | xargs cat | wc -l`
novacias=`find . -name "*.$ext" | xargs cat | awk 'BEGIN { lineas = 0 } { if ($0 != "") lineas++} END { print lineas }'`
vacias=`find . -name "*.$ext" | xargs cat | awk 'BEGIN { lineas = 0 } { if ($0 == "") lineas++} END { print lineas }'`
porcentaje=`echo $vacias $lineas | awk '{ print $1 / $2 * 100 }'`
echo Tiene $ficheros ficheros de tipo $ext y $lineas lineas, de las cuales $novacias tienen contenido y $vacias son vacias \(un $porcentaje %\)
ficheros_total=`expr $ficheros_total + $ficheros`
lineas_total=`expr $lineas_total + $lineas`
vacias_total=`expr $vacias_total + $vacias`
novacias_total=`expr $novacias_total + $novacias`
done
if [[ $# -gt 1 ]] ; then
porcentaje_total=`echo $vacias_total $lineas_total | awk '{ print $1 / $2 * 100 }'`
echo TOTAL
echo Tiene $ficheros_total ficheros en total, con $lineas_total lineas, de las cuales $novacias_total tienen contenido y $vacias_total son vacias \(un $porcentaje_total %\)
fi
Ejemplo de uso (guardandolo en un fichero cuenta_lineas.sh accesible por el path y con los permisos adecuados):
$ cd directorio_raiz_del_proyecto/ ; ./cuenta_lineas.sh java jsp xml
EXTENSION java
Tiene 388 ficheros de tipo java y 60035 lineas, de las cuales 47806 tienen contenido y 12230 son vacias (un 20.3714 %)
EXTENSION jsp
Tiene 792 ficheros de tipo jsp y 91354 lineas, de las cuales 75267 tienen contenido y 16088 son vacias (un 17.6106 %)
EXTENSION xml
Tiene 170 ficheros de tipo xml y 32282 lineas, de las cuales 30437 tienen contenido y 1846 son vacias (un 5.71836 %)
TOTAL
Tiene 1350 ficheros en total, con 183671 lineas, de las cuales 153510 tienen contenido y 30164 son vacias (un 16.4228 %)
Mola
aunque es mejorable sacando porcentajes (ver abajo
), pero no he encontrado un mandato tipo expr que trabaje con floats
(a ver si algún comentarista me da el tip
)
EDITO: Ya se me ha ocurrido cómo hacer los porcentajes mientras contestaba
actualizado el código y la salida del mismo
EDITO de nuevo: Si queréis añadir más filtros a las lineas vacías, tal y como sugiere Kortatu (que yo ya he barajado), tendréis que cambiar la línea
novacias=`find . -name "*.$ext" | xargs cat | awk 'BEGIN { lineas = 0 } { if ($0 != "") lineas++} END { print lineas }'`
por
novacias=`find . -name "*.$ext" | xargs cat | grep -v '^$' | grep -v '^\s*\}\s*$' | grep -v '^\s*\*.**$' | grep -v '^\s*/\*\*.*$' | grep -v '^\s.//.*$'
Útil para código de la familia Java :D. ¡Gracias!
WTF!!
Jo, pues siento decepcionar, pero de Bash lo justo para lo que he necesitado…. sin embargo (¿creías que te ibas a ir sin un “sin embargo”?) yo para contar líneas y esas cosas utilizo SLOCCount. No veo que soporte JSP y no recuerdo si te da porcentaje lineas vacias/llenas, pero está muy curioso el dato del valor del código. Algunas prácticas debía haberlas cobrado a precio de Super-98.
@kikeenrique WTF ha sido cuando he llegado a la solución final en una sola línea en la terminal
como ha ido creciendo poco a poco, no se me ha ocurrido meterlo en un fichero hasta que lo tenía todo
creo que si haces lo inverso de lo que hice yo como paso final (algo como cat fichero | tr ‘\n’ ‘;’) y quitas alguna coma, ¡puedes ejecutarlo al vuelo
!
@YoNoSoyTu el caso es que yo conozco mandatos para operar en terminal (por ejemplo apcalc), pero no vienen por defecto en un Unix común (y quizá en ninguno)… espera… tal que escribo esto se me ha ocurrido una forma de hacerlo… ¡qué gañan! voy a actualizarlo…
@YoNoSoyTu respecto al SLOCCount, le echaré un ojo por curiosidad. Realmente este script no tenía ni tendrá la menor pretensión de servir para nada, ha salido a causa de una pequeña guerra de comandos (que realmente eso sería si fuese una guerra de las clásicas, la nuestra era una guerra de mandatos
). Lo que pasa es que me daba pena que se perdiera en el olvido
Muy rico… aunque sigo diciendo que para obtener las líneas vacías es mejor un grep ‘^$’ que usar awk, va mucho más rápido…
Es que me daba penica dejar el script sin nada de awk
aunque ahora que lo uso para sacar el porcentaje (que triste
) bien se podrían sustituir los mandatos de líneas vacías y no vacías por grep ‘^$’ y grep -v ‘^$’ respectivamente
…
La virgen…. ¡Qué apañaos sois! Con ingenieros así da gusto.
Yo una vez hice una función que sumaba votos en Haskell… U^_^
Oye, acabo de recordar este script porque hemos estado contando líneas de código.
He añadido algunas cosas, como eliminar javadoc, líneas comentadas (de momento comentarios de línea, no de multilínea) y líneas en las que sólo hay una ‘}’, para ver cuántas líneas hay de código real (sí, sé que se pueden eliminar muchas más cosas como los import y tal)
Algunos de estos filtros son
grep -v ‘^\s*\}\s*$’ — Líneas con una llave de cerrar
grep -v ‘^\s*\*.**$’ — Líneas intermedias de javadoc
grep -v ‘^\s*/\*\*.*$’ — La primera línea de un javadoc
grep -v ‘^\s.//.*$’ — Líneas de comentarios
¡Muy rico! Ya lo he añadido a la entrada, gracias por la espalda de alimento
.