Answers:
最直接的解决方案是连接所有文件并将结果通过管道传递到脚本:
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}' {} +
或所有文件中的一个最大长度:
find . -type f -size +1c -exec cat {} + |
awk -v l=0 'length>l {l=length}; END{print l}'
假定文件以换行符结尾。如果一个文件没有以换行符结尾,则其最后一个非定界行将与下一个文件的第一行合并,并可能使结果无效。
-size +1c
是一种优化,因为文本文件为空或仅包含一个字符的行分别为0行和1空行,因此不会有最长的行。
cat * .* | ...
。或消除猫的无用使用并说出awk '...' * .*
。