si quiero contar las líneas de código, lo trivial es
cat *.c *.h | wc -l
¿Pero qué pasa si tengo varios subdirectorios?
recursive
source-code
Niklas
fuente
fuente
cat
?wc -l *.c *.h
hace lo mismowc -l *.c *.h | tail -n 1
obtener una salida similar.**
, por lo que podría haber utilizadowc -l **/*.{h,c}
o algo similar. Tenga en cuenta que en Bash, al menos, esta opción (llamadaglobstar
) está desactivada de forma predeterminada. Pero también tenga en cuenta que en este caso particular,cloc
oSLOCCount
es una opción mucho mejor. (Además,ack
puede ser preferiblefind
para encontrar / enumerar fácilmente archivos fuente.)Respuestas:
La forma más fácil es usar la herramienta llamada
cloc
. Úselo de esta manera:Eso es. :-)
fuente
Probablemente debería usar SLOCCount o cloc para esto, están diseñados específicamente para contar líneas de código fuente en un proyecto, independientemente de la estructura del directorio, etc .; ya sea
o
producirá un informe sobre todo el código fuente a partir del directorio actual.
Si quieres usar
find
ywc
, GNUwc
tiene una buena--files0-from
opción:(¡Gracias a SnakeDoc por la sugerencia de cloc !)
fuente
sloccount /tmp/stackexchange
(creada nuevamente el 17 de mayo después de mi reinicio más reciente) dice que el costo estimado para desarrollar los archivos sh, perl, awk, etc. que encontró es de $ 11,029. y eso no incluye las frases que nunca se convirtieron en un archivo de script.cloc
también es bueno: github.com/AlDanial/clocComo el
wc
comando puede tomar múltiples argumentos, puede pasar todos los nombres de archivo parawc
usar el+
argumento de la-exec
acción de GNUfind
:Alternativamente, en
bash
, usando la opción de shellglobstar
para recorrer los directorios de forma recursiva:Otros shells atraviesan recursivamente por defecto (p
zsh
. Ej. ) O tienen opciones similares comoglobstar
, bueno, al menos la mayoría.fuente
Puede usar
find
junto conxargs
ywc
:fuente
total
líneas siwc
se invocan varios s).wc
problema de varios comandos puede abordarse canalizandofind
a lawhile read FILENAME; do . . .done
estructura. Y dentro del uso del bucle whilewc -l
. El resto es resumir las líneas totales en una variable y mostrarla.Si se encuentra en un entorno donde no tiene acceso,
cloc
etc., le sugieroRecorrido:
find
busca de forma recursiva todos los archivos normales cuyo nombre termina en o.c
o.h
y se ejecutacat
en ellos. La salida se canalizagrep
para contar todas las líneas que no están en blanco (las que contienen al menos un carácter sin espaciado).fuente
Como se ha señalado en los comentarios, no
cat file | wc -l
es equivalente a porque el primero imprime solo un número mientras que el segundo imprime un número y el nombre del archivo. Del mismo modo , imprimirá solo un número, mientras que imprimirá una línea de información para cada archivo.wc -l file
cat * | wc -l
wc -l *
En un espíritu de simplicidad, volvamos a la pregunta que realmente se hizo:
En primer lugar, puede simplificar incluso su comando trivial para:
Y finalmente, el equivalente de muchos subdirectorios es:
Quizás esto podría mejorarse de muchas maneras, como restringir los archivos coincidentes solo a archivos normales (no directorios) agregando,
-type f
pero elfind
comando dado es el equivalente recursivo exacto decat *.[ch]
.fuente
Muestra usando
awk
:fuente
+
en lugar de\;
.wc -l
para grupos de archivos, más o menos como loxargs
hace, pero maneja caracteres extraños (como espacios) en los nombres de los archivos sin necesidad de ninguno dexargs
los dos (no estándar)-print0
y-0
opcionesfind
yxargs
respectivamente. Es una optimización menor. La desventaja sería que cada invocación dewc
generaría un recuento total de líneas al final cuando se le otorgan múltiples archivos; elawk
script se ocuparía de eso. Por lo tanto, no es un slam-dunk, pero muy a menudo, usar+
en lugar de\;
confind
es una buena idea.wc
. Si se desconoce a priori el número de archivos que se encontrarán , ¿existe el riesgo de pasar ese límite o de alguna manera se maneja mediante find?find
agrupa los archivos en paquetes de tamaño conveniente, que no excederá el límite de longitud para la lista de argumentos en la plataforma, permitiendo el entorno (que sale de la longitud de la lista de argumentos, por lo que la longitud de la lista de argumentos más el La longitud del entorno debe ser inferior a un valor máximo). IOW,find
hace bien el trabajo, comoxargs
hace bien el trabajo.comando fácil:
fuente
total
líneas siwc
se invocan varios s).Si estás en Linux, te recomiendo mi propia herramienta, polyglot . Es dramáticamente más rápido
cloc
y con más funciones quesloccount
.También debería poder construir en BSD, aunque no hay ningún binario proporcionado.
Puedes invocarlo con
fuente
find . -name \*.[ch] -print | xargs -n 1 wc -l
debería hacer el truco. También hay varias variaciones posibles sobre eso, como usar en-exec
lugar de canalizar la salida awc
.fuente
find . -name \*.[ch] -print
no imprime el contenido de los archivos, solo los nombres de los archivos. Entonces, cuento la cantidad de archivos, ¿no? ¿Necesito 'xargs'?xargs
, y también necesitaría estar atento a laswc
invocaciones múltiples si tiene muchos archivos; deberías buscar todas lastotal
líneas y sumarlas.find . -name \*.[ch] -print0 | xargs -0 cat | wc -l
find . -name \*.[ch] -print | wc -l
) cuenta el número de archivos (a menos que el nombre de un archivo contenga una nueva línea, pero eso es muy inusual), no cuenta el número de líneas en los archivos.