Tenemos una aplicación PHP y queremos contar todas las líneas de código en un directorio específico y sus subdirectorios. No necesitamos ignorar los comentarios, ya que solo estamos tratando de tener una idea aproximada.
wc -l *.php
Ese comando funciona muy bien dentro de un directorio dado, pero ignora los subdirectorios. Estaba pensando que esto podría funcionar, pero está devolviendo 74, que definitivamente no es el caso ...
find . -name '*.php' | wc -l
¿Cuál es la sintaxis correcta para alimentar en todos los archivos?
find . -name '*.php' -o -name '*.inc' | xargs wc -l
wc
se ejecute varias veces también no maneja muchos nombres de archivo especial..find . -name "*.php" -not -path "./tests*" | xargs wc -l
Para otra línea:
funciona en nombres con espacios, solo genera un número.
fuente
man find
.. print0 con xargs -0 le permite operar en archivos que tienen espacios u otros caracteres extraños en su nombre( find . \( -name '*.h' -o -name '*.cpp' \) -print0 | xargs -0 cat ) | wc -l
Si usa una versión decentemente reciente de Bash (o ZSH), es mucho más simple:
En el shell Bash, esto requiere
globstar
que se establezca la opción, de lo contrario, el**
operador glob no es recursivo. Para habilitar esta configuración, emitaPara hacer esto permanente, agréguelo a uno de los archivos de inicialización (
~/.bashrc
,~/.bash_profile
etc.).fuente
globstar
estar configurado para que esto funcione.wc -l **/*.[ch]
encuentra un total de 15195373 líneas. No estoy seguro si considera que es un "valor muy bajo". Una vez más, debe asegurarse de haberglobstar
habilitado en Bash. Puedes consultar conshopt globstar
. Para habilitarlo explícitamente, hazloshopt -s globstar
.ARG_MAX
si tiene una gran cantidad de.php
archivos, yawc
que no está integrada.find
contienen espacios. Eso podría solucionarse usandoprint0
y--null
con las llamadasfind
yxargs
, respectivamente.Puede usar la
cloc
utilidad que está construida para este propósito exacto. Informa a cada uno la cantidad de líneas en cada idioma, junto con cuántos de ellos son comentarios, etc. CLOC está disponible en Linux, Mac y Windows.Ejemplo de uso y salida:
fuente
cloc
es multiplataforma ya que es solo un script de Perl?En sistemas similares a UNIX, existe una herramienta llamada
cloc
que proporciona estadísticas de código.Me encontré con un directorio aleatorio en nuestra base de código que dice:
fuente
choco install cloc
No especificó cuántos archivos hay o cuál es la salida deseada. Es esto lo que estás buscando:
fuente
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/* . }
Los resultados fueron cerca de slocount*.py
, pero no lo sabía*.js
,*.html
.Otra variación más :)
Editar: esto le dará la suma total, en lugar de archivo por archivo.
Edit2: Agregar
.
despuésfind
para que funcionefuente
$ find -name \*\.php -print0 | xargs -0 cat | wc -l
find . -name '*.php' | xargs cat | wc -l
... mientras que esto da archivo por archivo y un gran total:find . -name '*.php' | xargs wc -l
Sorprendentemente no hay respuesta basada en hallazgos
-exec
yawk
. Aquí vamos:Este fragmento se encuentra para todos los archivos (
-type f
). Para buscar por extensión de archivo, use-name
:fuente
find . -name '*.c' -print0 |xargs -0 wc -l
. Dicho esto, este método más rápido (al menos en OS X), termina imprimiendo "total" varias veces, por lo que se requiere un filtrado adicional para obtener un total adecuado (publiqué detalles en mi respuesta).wc
en forma de acat
es lento porque el sistema primero debe procesar todos los GB para comenzar a contar las líneas (probado con 200 GB de jsons, archivos de 12k). hacerwc
primero y luego contar el resultado es mucho más rápidofind . -type f -exec wc -l {} \+
ofind . -name '*.py' -type f -exec wc -l {} \+
que imprime un total al final de la salida. Si todo lo que le interesa es el total, entonces podría ir un poco más lejos y usartail
:find . -type f -exec wc -l {} \+ | tail -1
ofind . -name '*.py' -type f -exec wc -l {} \+ | tail -1
Más común y simple para mí, supongamos que necesita contar archivos de diferentes extensiones de nombre (digamos, también nativos)
Gracias por los comentarios, lo he corregido.
fuente
$()
POSIX
A diferencia de la mayoría de las otras respuestas aquí, estas funcionan en cualquier sistema POSIX, para cualquier número de archivos y con cualquier nombre de archivo (excepto donde se indique).
Líneas en cada archivo:
Líneas en cada archivo, ordenadas por la ruta del archivo
Líneas en cada archivo, ordenadas por número de líneas, descendiendo
Líneas totales en todos los archivos
fuente
Hay una pequeña herramienta llamada sloccount para contar las líneas de código en el directorio. Cabe señalar que hace más de lo que desea, ya que ignora las líneas / comentarios vacíos, agrupa los resultados por lenguaje de programación y calcula algunas estadísticas.
fuente
Lo que quieres es un
for
bucle simple :fuente
xargs
?IFS=$'\n'
antes del bucle al menos lo arreglaría para todos menos los archivos con nuevas líneas en sus nombres. En segundo lugar, no está citando'*.php'
, por lo que el shell lo expandirá y nofind
, y ergo no encontrará ninguno de los archivos php en subdirectorios. También-print
es redundante, ya que está implícito en ausencia de otras acciones.solo para fuentes:
para filtrar, solo use grep
fuente
Una sencilla que será rápida, usará todo el poder de búsqueda / filtrado de
find
, no fallará cuando haya demasiados archivos (desbordamiento de argumentos numéricos), funcionará bien con archivos con símbolos divertidos en su nombre, sin usarxargs
, no lanzará un inútilmente alto número de comandos externos (gracias a+
forfind
's-exec
). Aqui tienes:fuente
\;
lugar de+
como no lo sabía), esta respuesta debería ser la respuesta correcta.Sé que la pregunta está etiquetada como golpetazo, pero parece que el problema que está tratando de resolver también está relacionado con PHP.
Sebastian Bergmann escribió una herramienta llamada PHPLOC que hace lo que quiere y además le brinda una visión general de la complejidad de un proyecto. Este es un ejemplo de su informe:
Como puede ver, la información proporcionada es mucho más útil desde la perspectiva de un desarrollador, ya que puede decirle aproximadamente cuán complejo es un proyecto antes de comenzar a trabajar con él.
fuente
Adivinando que nadie verá esto enterrado en la parte posterior ... Sin embargo, ninguna de las respuestas hasta ahora llega al problema de los nombres de archivos con espacios. Además, todos los usos
xargs
están sujetos a fallas si la longitud total de las rutas en el árbol excede el límite del tamaño del entorno de shell (el valor predeterminado es unos pocos megabytes en Linux). Aquí hay uno que soluciona estos problemas de una manera bastante directa. La subshell se encarga de los archivos con espacios. Elawk
total del flujo dewc
salidas de archivos individuales , por lo que nunca debe quedarse sin espacio. También restringe losexec
archivos solamente (omitiendo directorios):fuente
wc -l? ¡Incorrecto! ¡El comando wc cuenta nuevos códigos de líneas, no líneas! Cuando la última línea del archivo no termina con un nuevo código de línea, ¡ esto no contará!
si aún desea contar líneas, use grep -c ^ , ejemplo completo:
finalmente, ten cuidado con la trampa wc -l (¡¡¡las cuentas entran, no las líneas !!!)
fuente
grep -c ^
usted está contando el número de líneas incompletas , y tales líneas incompletas no pueden aparecer en un archivo de texto .find -type f -name '*.php' -print0 | xargs -0 grep -ch ^ | paste -sd+ - | bc
consulte aquí las alternativas abc
: stackoverflow.com/q/926069/2400328muy simple
fuente
Si desea que sus resultados se ordenen por número de líneas, puede agregar
| sort
o| sort -r
(-r
en orden descendente) a la primera respuesta, de la siguiente manera:fuente
xargs wc -l
es numérica, uno realmente necesitaría usarsort -n
osort -nr
.Para Windows , la herramienta fácil y rápida es LocMetrics .
fuente
Algo diferente:
Esto funciona bien, pero debe tener al menos un
*.php
archivo en la carpeta actual o una de sus subcarpetas, o de lo contrario sewc
detienefuente
Si estás en Linux (y supongo que sí), recomiendo mi herramienta políglota . Es mucho más rápido que cualquiera de los dos
sloccount
ocloc
y tiene más posibilidades quesloccount
.Puedes invocarlo con
o
así que es mucho más fácil de usar que un script bash complicado.
fuente
Es muy fácil con zsh globs:
Si está utilizando bash, solo necesita actualizar. No hay absolutamente ninguna razón para usar bash.
fuente
La herramienta Tokei muestra estadísticas sobre el código en un directorio. Tokei mostrará la cantidad de archivos, líneas totales dentro de esos archivos y código, comentarios y espacios en blanco agrupados por idioma. Tokei también está disponible en Mac, Linux y Windows.
Un ejemplo de la salida de Tokei es el siguiente:
Tokei se puede instalar siguiendo las instrucciones en el archivo README en el repositorio .
fuente
Si necesita solo el número total de líneas en, digamos sus archivos PHP, puede usar un comando de una línea muy simple incluso en Windows si tiene instalado GnuWin32. Me gusta esto:
Debe especificar dónde está exactamente el find.exe; de lo contrario, se ejecutará FIND.EXE proporcionado por Windows (de los antiguos comandos similares a DOS), ya que probablemente sea anterior al GnuWin32 en la RUTA del entorno y tenga diferentes parámetros y resultados.
Tenga en cuenta que en el comando anterior debe usar comillas inversas, no comillas simples.
fuente
Dar primero los archivos más largos (es decir, ¿tal vez estos archivos largos necesitan un poco de amor refactorizante?) Y excluir algunos directorios de proveedores:
fuente
Si quiere que sea simple, elimine al intermediario y simplemente llame
wc
con todos los nombres de archivo:O en la sintaxis moderna:
Funciona siempre que no haya espacios en ninguno de los nombres de directorio o nombres de archivo. Y siempre que no tenga decenas de miles de archivos (los shells modernos admiten líneas de comando realmente largas). Su proyecto tiene 74 archivos, por lo que tiene mucho espacio para crecer.
fuente
wc -l `find . -type f \( -name "*.cpp" -o -name "*.c" -o -name "*.h" \) -print`
No necesita todos estos comandos complicados y difíciles de recordar. Solo necesitas una herramienta llamada line-counter .
Un resumen rápido
Así es como obtienes la herramienta
Use el
line
comando para obtener el recuento de archivos y el recuento de líneas en el directorio actual (recursivamente)Si quieres más detalles, solo úsalo
line -d
.Y la mejor parte de esta herramienta es que puede agregarle
.gitignore
un archivo de configuración similar. Puede configurar reglas para seleccionar o ignorar qué tipo de archivos contar al igual que lo que hace en '.gitignore'.Más descripción y uso está aquí: https://github.com/MorganZhang100/line-counter
fuente
Si los archivos son demasiados, es mejor buscar el recuento total de líneas.
fuente
Al menos en OS X, los comandos find + xarg + wc enumerados en algunas de las otras respuestas imprimen "total" varias veces en listados grandes, y no se da un total completo. Pude obtener un total único para archivos .c usando el siguiente comando:
find . -name '*.c' -print0 |xargs -0 wc -l|grep -v total|awk '{ sum += $1; } END { print "SUM: " sum; }'
fuente