Aquí hay otra forma de hacerlo usando awk:
#!/usr/bin/env bash
for dir in "$@"; do
for file in "$dir"/*; do
awk 'END{if(NR>=15 && NR<=50){print FILENAME}}' "$file";
done
done
EXPLICACIÓN: awk(y sus muchas variantes como gawko mawketc.) leen un archivo línea por línea. La variable NRes el número de línea actual. Se END{}ejecutará un bloque cuando se llegue a la última línea del archivo de entrada, en cuyo punto NRserá el número de líneas en el archivo. Finalmente, FILENAMEes el nombre del archivo que se está procesando actualmente. Entonces, el script imprime el nombre del archivo si el número de líneas que ha visto está entre 15 y 50.
Del mismo modo, puedes hacer esto con Perl:
#!/usr/bin/env bash
for dir in "$@"; do
for file in "$dir"/*; do
perl -ne 'END{if($. >=15 && $. <=50){print "$ARGV\n"}}' "$file"
done
done
EXPLICACIÓN: perl -netambién leerá un archivo línea por línea. En Perl, el número de línea actual se almacena $.y el ENDbloque funciona de la misma manera que en awk. $ARGVes el argumento pasado en la línea de comando, el nombre del archivo que se imprimirá solo si tiene el número correcto de líneas.
Probablemente, su mejor opción sea bash y wc respuesta de @grawity, pero la wcimplementación no afectará a estos y debería funcionar bien en cualquier * nix.
for f in `ls`, por favor. Simplemente usefor f in *. Ver: mywiki.wooledge.org/ParsingLs