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 -lwcse ejecute varias veces también no maneja muchos nombres de archivo especial..find . -name "*.php" -not -path "./tests*" | xargs wc -lPara 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 -lSi usa una versión decentemente reciente de Bash (o ZSH), es mucho más simple:
En el shell Bash, esto requiere
globstarque 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_profileetc.).fuente
globstarestar 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 haberglobstarhabilitado en Bash. Puedes consultar conshopt globstar. Para habilitarlo explícitamente, hazloshopt -s globstar.ARG_MAXsi tiene una gran cantidad de.phparchivos, yawcque no está integrada.findcontienen espacios. Eso podría solucionarse usandoprint0y--nullcon las llamadasfindyxargs, respectivamente.Puede usar la
clocutilidad 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
cloces multiplataforma ya que es solo un script de Perl?En sistemas similares a UNIX, existe una herramienta llamada
clocque proporciona estadísticas de código.Me encontré con un directorio aleatorio en nuestra base de código que dice:
fuente
choco install clocNo 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ésfindpara que funcionefuente
$ find -name \*\.php -print0 | xargs -0 cat | wc -lfind . -name '*.php' | xargs cat | wc -l... mientras que esto da archivo por archivo y un gran total:find . -name '*.php' | xargs wc -lSorprendentemente no hay respuesta basada en hallazgos
-execyawk. 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).wcen forma de acates 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). hacerwcprimero 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 -1ofind . -name '*.py' -type f -exec wc -l {} \+ | tail -1Má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
forbucle 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-printes 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
xargsestá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. Elawktotal del flujo dewcsalidas de archivos individuales , por lo que nunca debe quedarse sin espacio. También restringe losexecarchivos 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+ - | bcconsulte 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
| sorto| sort -r(-ren orden descendente) a la primera respuesta, de la siguiente manera:fuente
xargs wc -les numérica, uno realmente necesitaría usarsort -nosort -nr.Para Windows , la herramienta fácil y rápida es LocMetrics .
fuente
Algo diferente:
Esto funciona bien, pero debe tener al menos un
*.phparchivo en la carpeta actual o una de sus subcarpetas, o de lo contrario sewcdetienefuente
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
sloccountoclocy 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
wccon 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
linecomando 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
.gitignoreun 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