Pregunta

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

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

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

¿Fue útil?

Solución

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

wc `find -name '*.m'`

Otros consejos

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 comando, 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

El uso de cat de esta manera está bien, ya que su salida se canaliza directamente hacia wc , por lo que solo una pequeña cantidad del contenido de los archivos se guarda 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á a un solo wc proceso.

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

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

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

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

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

donde '$ =' es una " variable especial " que mantienen el recuento de lineas

EDIT

También puedes probar algo como sloccount

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

La segunda solución no da el total, solo líneas por archivo, como lo 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é archivos grandes tengas.

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

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

Usando + en lugar de \; fuerza encontrar para llamar awk a todos los archivos N encontrados (como con xargs).

Para los directorios grandes debemos 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}' 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top