回答:
最も簡単な解決策は、すべてのファイルを連結し、結果をスクリプトにパイプすることです。
cat ./* | awk '{ if ( length > L ) { L=length} }END{ print L}'
また、いくつかのファイルをawkに直接渡すこともできます。
awk '{ if ( length > L ) { L=length} }END{ print L}' ./*
もちろん、ファイルが実際にディレクトリにある場合は警告が表示されますが、無害であるべきです。バイナリファイルにはlineという概念がないため、大きな問題が発生する可能性があります。したがって、より具体的にするために、次のようなことができます
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}' {} +
または、すべてのファイルの1つの最大長:
find . -type f -size +1c -exec cat {} + |
awk -v l=0 'length>l {l=length}; END{print l}'
これは、ファイルが改行文字で終わることを前提としています。1つのファイルが改行文字で終わらない場合、その区切りのない最後の行は次のファイルの最初の行とマージされ、結果が無効になる可能性があります。
-size +1c
空のテキストファイルまたは1文字のみを含むテキストファイルはそれぞれ0行と1行の空行があるため、最長の行はないため、最適化です。
cat * .* | ...
。または猫と言うの無駄な使用を排除しますawk '...' * .*
。