Usa find, wc y sed para contar líneas
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?
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}'