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 *.hhace lo mismowc -l *.c *.h | tail -n 1obtener 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,clocoSLOCCountes una opción mucho mejor. (Además,ackpuede ser preferiblefindpara 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
findywc, GNUwctiene una buena--files0-fromopció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.cloctambién es bueno: github.com/AlDanial/clocComo el
wccomando puede tomar múltiples argumentos, puede pasar todos los nombres de archivo parawcusar el+argumento de la-execacción de GNUfind:Alternativamente, en
bash, usando la opción de shellglobstarpara 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
findjunto conxargsywc:fuente
totallíneas siwcse invocan varios s).wcproblema de varios comandos puede abordarse canalizandofinda lawhile read FILENAME; do . . .doneestructura. 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,
clocetc., le sugieroRecorrido:
findbusca de forma recursiva todos los archivos normales cuyo nombre termina en o.co.hy se ejecutacaten ellos. La salida se canalizagreppara 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 -les 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 filecat * | wc -lwc -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 fpero elfindcomando dado es el equivalente recursivo exacto decat *.[ch].fuente
Muestra usando
awk:fuente
+en lugar de\;.wc -lpara grupos de archivos, más o menos como loxargshace, pero maneja caracteres extraños (como espacios) en los nombres de los archivos sin necesidad de ninguno dexargslos dos (no estándar)-print0y-0opcionesfindyxargsrespectivamente. Es una optimización menor. La desventaja sería que cada invocación dewcgeneraría un recuento total de líneas al final cuando se le otorgan múltiples archivos; elawkscript se ocuparía de eso. Por lo tanto, no es un slam-dunk, pero muy a menudo, usar+en lugar de\;confindes 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?findagrupa 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,findhace bien el trabajo, comoxargshace bien el trabajo.comando fácil:
fuente
totallíneas siwcse invocan varios s).Si estás en Linux, te recomiendo mi propia herramienta, polyglot . Es dramáticamente más rápido
clocy 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 -ldebería hacer el truco. También hay varias variaciones posibles sobre eso, como usar en-execlugar de canalizar la salida awc.fuente
find . -name \*.[ch] -printno 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 laswcinvocaciones múltiples si tiene muchos archivos; deberías buscar todas lastotallíneas y sumarlas.find . -name \*.[ch] -print0 | xargs -0 cat | wc -lfind . -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.