Respostas:
A solução mais direta é concatenar todos os arquivos e canalizar o resultado para o seu script:
cat ./* | awk '{ if ( length > L ) { L=length} }END{ print L}'
Você também pode passar diretamente vários arquivos para o awk:
awk '{ if ( length > L ) { L=length} }END{ print L}' ./*
Obviamente, pode haver alguns avisos se os arquivos forem de fato diretórios, mas devem ser inofensivos. Você pode ter problemas maiores com arquivos binários porque eles não têm um conceito de linha . Então, para ser mais específico, você pode fazer algo como
awk '{ if ( length > L ) { L=length} }END{ print L}' ./*.txt
para corresponder apenas aos .txt
arquivos no diretório atual.
E, como o @ G-Man afirmou em seu comentário, *
não corresponderá a arquivos ocultos (começando com um ponto). Se você quiser, use * .*
.
Se você deseja o tamanho máximo por arquivo, com o GNU awk:
find . -type f -exec awk -v l=0 '
length>l {l=length} ENDFILE{print FILENAME ":", l; l=0}' {} +
Ou o comprimento máximo em todos os arquivos:
find . -type f -size +1c -exec cat {} + |
awk -v l=0 'length>l {l=length}; END{print l}'
Isso pressupõe que os arquivos terminem em caracteres de nova linha. Se um arquivo não terminar em um caractere de nova linha, sua última linha não delimitada será mesclada com a primeira linha do próximo arquivo e possivelmente anulará o resultado.
-size +1c
é uma otimização, pois os arquivos de texto que estão vazios ou contêm apenas um caractere têm respectivamente 0 linha e 1 linha vazia, portanto, não terão a linha mais longa.
Também com o GNU wc (coreutils 8.4), ele pode lidar com vários arquivos
wc -L *.txt
wc -L
faz, mas sua solução tem a desvantagem de que você precisa percorrer primeiro o comprimento máximo de todos os outros arquivos. Existe alguma vantagem nisso?
cat * .* | ...
,. Ou elimine o uso inútil do gato e digaawk '...' * .*
.