Pase "nombre de file" de un file de text a una línea de command donde cada línea de un file es nombre de file

Estoy ejecutando el siguiente código

git log --pretty=format: --numstat -- SOMEFILENAME | perl -ane '$i += ($F[0]-$F[1]); END{print "changed: $i\n"}' \ >> random.txt 

Lo que hace es tomar un file con el nombre "SOMEFILENAME" y guarda la sum de la cantidad total de líneas agregadas y eliminadas en un file de text llamado "random.txt"

Necesito ejecutar este progtwig en cada file en el repository y hay muchos de ellos. ¿Cuál sería una manera fácil de hacer esto?

Si quieres un total por file:

 git log --pretty=format: --numstat | perl -ane' $c{$F[2]} += $F[0]-$F[1] if $F[2]; END { print "$_\t$c{$_}\n" for sort keys %c } ' >random.txt 

Si quieres un total único:

 git log --pretty=format: --numstat | perl -ane' $c += $F[0]-$F[1]; END { print "$c\n" } ' >random.txt 

Sus respectivos resultados son:

 .gitignore 22 Build.PL 48 CHANGES.txt 0 Changes 25 LICENSE 132 LICENSE.txt 0 MANIFEST 18 MANIFEST.SKIP 9 README.txt 67 TODO.txt 1 lib/feature/qw_comments.pm 129 lib/feature/qw_comments.xs 250 t/00_load.t 13 t/01_basic.t 85 t/02_pragma.t 56 t/03_line_numbers.t 37 t/04_errors.t 177 t/05-unicode.t 39 t/devel-pod-coverage.t 26 t/pod.t 17 

y

 1151 

En lugar de usar find , puedes dejar que git te proporcione todos los files usando el nombre . (representando el directory actual). Con eso, aquí hay una versión que usa awk que imprime statistics por file:

 git log --pretty=format: --numstat -- . | awk ' NF == 3 {changed[$3] += $1 - $2} END { for (name in changed) { printf("%s: %d changed\n", name, changed[name]); } } ' 

Y uno aún más corto que imprime una única línea cambiada general:

 git log --pretty=format: --numstat -- . | awk ' NF == 3 {changed += $1 - $2} END { printf("%d changed\n", changed); } ' 

(El NF == 3 es para explicar el hecho de que git parece imprimir líneas en blanco falsas en su salida. No traté de averiguar si hay un mejor command git ).