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).