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 gawk
o mawk
etc.) leen un archivo línea por línea. La variable NR
es 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 NR
será el número de líneas en el archivo. Finalmente, FILENAME
es 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 -ne
también leerá un archivo línea por línea. En Perl, el número de línea actual se almacena $.
y el END
bloque funciona de la misma manera que en awk
. $ARGV
es 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 wc
implementació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