bash sed find wc

bash - Usa find, wc, y sed para contar líneas



(8)

En las plataformas GNU modernas, busque y encuentre los parámetros take -print0 y -files0-from que se pueden combinar en un comando que cuente líneas en archivos con total al final. Ejemplo:

find . -name ''*.c'' -type f -print0 | wc -l --files0-from=-

Estaba tratando de usar sed para contar todas las líneas basadas en una extensión particular.

find -name ''*.m'' -exec wc -l {} /; | sed ...

Intentaba hacer lo siguiente, ¿cómo incluiría sed en esta línea en particular para obtener los totales?


Hm, la solución con cat puede ser problemática si tienes muchos archivos, especialmente los más grandes.

La segunda solución no da total, solo líneas por archivo, como probé.

Prefiero algo como esto:

find . -name ''*.m'' | xargs wc -l | tail -1

Esto hará el trabajo rápido, sin importar cuántos y qué tan grandes sean tus archivos.


La mayoría de las respuestas aquí no funcionarán bien para una gran cantidad de archivos. Algunos se romperán si la lista de nombres de archivos es demasiado larga para una sola llamada de línea de comandos, mientras que otros son ineficientes porque -exec inicia un nuevo proceso para cada archivo. Creo que una solución robusta y eficiente sería:

find . -type f -name "*.m" -print0 | xargs -0 cat | wc -l

Usar cat de esta forma es bueno, ya que su salida se conecta directamente al wc modo que solo una pequeña cantidad del contenido de los archivos se mantiene en la memoria a la vez. Si hay demasiados archivos para una sola invocación de cat , se llamará a cat varias veces, pero toda la salida se canalizará en un solo proceso de wc .


Para grandes directorios deberíamos usar:

find . -type f -name ''*.m'' -exec sed -n ''$='' ''{}'' + 2>/dev/null | awk ''{ total+=$1 }END{print total}'' # alternative using awk twice find . -type f -name ''*.m'' -exec awk ''END {print NR}'' ''{}'' + 2>/dev/null | awk ''{ total+=$1 }END{print total}''


Puede cat todos los archivos a través de una única instancia de wc para obtener el número total de líneas:

find . -name ''*.m'' -exec cat {} /; | wc -l


También puede obtener el buen formato de wc con:

wc `find -name ''*.m''`


podrías usar sed también para contar líneas en lugar de wc:

find . -name ''*.m'' -exec sed -n ''$='' {} /;

donde ''$='' es una "variable especial" que mantiene el recuento de líneas

EDITAR

también puedes probar algo como sloccount


sed no es la herramienta adecuada para contar. Use awk en su lugar:

find . -name ''*.m'' -exec awk ''{print NR}'' {} +

Usar + en lugar de /; fuerzas encuentran llamar awk cada N archivos encontrados (como con xargs).