Ответы:
Самое простое решение - объединить все файлы и передать результат в ваш скрипт:
cat ./* | awk '{ if ( length > L ) { L=length} }END{ print L}'
Вы также можете напрямую передать несколько файлов в awk:
awk '{ if ( length > L ) { L=length} }END{ print L}' ./*
Конечно, могут быть некоторые предупреждения, если файлы на самом деле являются каталогами, но это должно быть безвредно. У вас могут быть большие проблемы с бинарными файлами, потому что они не имеют понятия строки . Итак, чтобы быть более конкретным, вы можете сделать что-то вроде
awk '{ if ( length > L ) { L=length} }END{ print L}' ./*.txt
сопоставлять только .txt
файлы в текущем каталоге.
И, как сказал @ G-Man в своем комментарии, *
не будет совпадать со скрытыми файлами (начиная с точки). Если вы хотите, используйте * .*
.
Если вы хотите максимальную длину для файла, с GNU awk:
find . -type f -exec awk -v l=0 '
length>l {l=length} ENDFILE{print FILENAME ":", l; l=0}' {} +
Или одна максимальная длина во всех файлах:
find . -type f -size +1c -exec cat {} + |
awk -v l=0 'length>l {l=length}; END{print l}'
Это предполагает, что файлы заканчиваются символами новой строки. Если один файл не заканчивается символом новой строки, то его последняя не разделенная строка будет объединена с первой строкой следующего файла и, возможно, приведет к аннулированию вашего результата.
-size +1c
Это оптимизация, так как текстовые файлы, которые являются пустыми или содержат только один символ, имеют соответственно 0 строк и 1 пустую строку, поэтому не будут иметь самую длинную строку.
Также с GNU wc (coreutils 8.4) он может обрабатывать несколько файлов
wc -L *.txt
wc -L
, но у вашего решения есть недостаток, заключающийся в том, что вы сначала должны просмотреть максимальную длину всех остальных файлов. Есть ли в этом преимущество?
cat * .* | ...
. Или исключить бесполезное использование кошки и сказатьawk '...' * .*
.