No voy a "código de golf" esto (la más corta wins).. Esto es más como "código de baloncesto".
Debido a que sus necesidades son un poco complejos, me dicen que el uso de la mayoría de los sintonizable opción.
Lanzamos con
Find (root directory) -type f | perl count21
Count21 es un archivo que contiene algunos de perl.
while (<>) { # read each line of input into variable $_
chomp $_; # Removing newline at end of line, if exists. It does.
local $/ = undef; # Input will ignore newlines and slurp in entire file
open (my $IN, "<", $_); # immune to < > ' " tab etc. in filename
my $text = <$IN>; # read entire file
chomp $text; # remove last newline if exists, so files with or
# without trailing newlines are the same.
$lc = ( $text =~ tr/\n// ) + 1; # tr/\n// counts newline characters.
# $text =~ says apply this operation to $text.
# The value of this operation is char count.
# Add 1 so we count the last line.
# This count will be wrong on 0-line files,
# but that's outside of problem scope.
if (21 >= $lc) { # if $lc <= 21 (Putting var first is bad luck)
print $_, "\n"; # print filename, and a newline
} # endif
} # end while(<>)
Molesta con todo esto perl y evitar todo acceso directo parece estúpida. La razón para hacerlo es que usted puede mucho más fácil lidiar con la inesperada arrugas, como la "algunas de las líneas que no terminan en newline" problema, fija fácilmente con un chomp y un +1 aquí.
Esto también armas nucleares-de-órbita el problema que tendría con el paso de las listas de archivos en shell, tales como nombres de archivo con espacios, ", ', |, ficha y otras monkeywrenches. Por desgracia, la tubería de Encontrar no manejar el salto de línea en un nombre de archivo, pero el Archivo Perl::módulo de búsqueda de la voluntad.
También hace que sea fácil de calzar en cosas aún más: por ejemplo, si sólo desea los archivos con la "diddle", añade
next if not ( $text =~ /diddle/i );