Respuestas:
La solución más sencilla es concatenar todos los archivos y canalizar el resultado a su script:
cat ./* | awk '{ if ( length > L ) { L=length} }END{ print L}'
También puede pasar directamente varios archivos a awk:
awk '{ if ( length > L ) { L=length} }END{ print L}' ./*
Por supuesto, puede haber algunas advertencias si los archivos son en realidad directorios, pero debería ser inofensivo. Puede tener mayores problemas con los archivos binarios porque no tienen un concepto de línea . Entonces, para ser más específicos, puedes hacer algo como
awk '{ if ( length > L ) { L=length} }END{ print L}' ./*.txt
para que coincida solo con el .txt
archivos en el directorio actual.
Y, como dijo @ G-Man en su comentario, *
no coincidirá con los archivos ocultos (comenzando con un punto). Si quieres esos, úsalos * .*
.
Si desea la longitud máxima por archivo, con GNU awk:
find . -type f -exec awk -v l=0 '
length>l {l=length} ENDFILE{print FILENAME ":", l; l=0}' {} +
O la longitud máxima en todos los archivos:
find . -type f -size +1c -exec cat {} + |
awk -v l=0 'length>l {l=length}; END{print l}'
Eso supone que los archivos terminan en caracteres de nueva línea. Si un archivo no termina en un carácter de nueva línea, su última línea no delimitada se fusionará con la primera línea del siguiente archivo y posiblemente anule su resultado.
-size +1c
es una optimización ya que los archivos de texto que están vacíos o que contienen un solo carácter tienen respectivamente 0 líneas y 1 línea vacía, por lo que no tendrán la línea más larga.
También con GNU wc (coreutils 8.4), puede manejar múltiples archivos
wc -L *.txt
wc -L
, pero su solución tiene la desventaja de que primero debe atravesar la longitud máxima de todos los demás archivos. ¿Hay alguna ventaja en eso?
cat * .* | ...
. O eliminar el uso inútil del gato y decirawk '...' * .*
.