Відповіді:
Найпростішим рішенням є об'єднання всіх файлів і передача результату на ваш сценарій:
cat ./* | awk '{ if ( length > L ) { L=length} }END{ print L}'
Ви також можете передати декілька файлів, щоб розбудити:
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 '...' * .*
.