답변:
가장 간단한 해결책은 모든 파일을 연결하고 결과를 스크립트로 파이프하는 것입니다.
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 줄을 가지므로 가장 긴 줄을 가지지 않는 최적화입니다.
또한 GNU wc (coreutils 8.4)를 사용하면 여러 파일을 처리 할 수 있습니다
wc -L *.txt
wc -L
같지만 솔루션은 다른 모든 파일의 최대 길이를 먼저 넘어야한다는 단점이 있습니다. 거기에 어떤 장점이 있습니까?
cat * .* | ...
. 또는 고양이 의 쓸모없는 사용을 제거 하고 말하십시오awk '...' * .*
.