6 votos

Finder / Terminal: busque archivos que contengan menos de 21 líneas de texto

Tengo un montón de archivos de texto que tienen un número diferente de líneas de texto en ellos.

En el Finder de Mac OS, hay alguna forma de buscar archivos que están a menos de 21 líneas? (es decir, cada archivo tiene menos de 21 línea de texto en ellos).

La Búsqueda de archivos da un montón de opciones, pero no puedo ver que es para la longitud de la línea.

A partir de la lectura sobre el tema, parece que el uso de Grep en la Terminal puede ser la mejor manera, pero no he encontrado fuentes que explican cómo usar Grep para buscar la longitud de la línea en varios archivos.

12voto

En la Terminal se puede combinar find y wc para este:

find /path/to/directory -type f \
    -exec bash -c '[[ $(wc -l < "$1") -lt 21 ]]' _ {} \; -print

Esto va a buscar todos los archivos (-type f) por debajo de /path/to/directory, recuento de las líneas (wc -l < "{}", {} se sustituye por cualquier archivo que se encuentre) y la impresión del nombre de archivo para los archivos que contienen menos de 21 líneas.

PS: también se intenta el conteo de las líneas de no-archivos de texto. Si esto causa problemas, utilice el siguiente lugar:

find /path/to/directory -type f -exec bash -c 'file -b "$1" | grep -q text' _ {} \; \
    -exec bash -c '[[ $(wc -l < "$1") -lt 21 ]]' _ {} \; -print

PPS: Para iniciar desde el directorio actual, reemplace la ruta de acceso en el principio con . (un punto único, para el directorio actual)

PPA: Para restringir la búsqueda a el directorio actual, utilice find . -maxdepth 1 -type f ...

5voto

Michael Zhou Puntos 167

He aquí otro shell solución. Partimos desde el directorio de trabajo actual . -

find . -type f -exec wc -l {} + | sed '$d'| awk '$1 < 21 { $1=""; print}'

find filtros sólo los archivos y ejecuta wc para todos los archivos encontrados. La salida se canaliza a sed donde podemos eliminar la última línea, que sería algo así como- ### Total.

awk luego de los procesos de cada línea de salida de la primera columna a ser menos de 21 líneas y se imprime el nombre del archivo en la columna 2 de la salida en las salas.

2voto

Harper Puntos 114

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 ); 

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X