Câu trả lời:
Giải pháp đơn giản nhất là nối tất cả các tệp và đưa kết quả vào tập lệnh của bạn:
cat ./* | awk '{ if ( length > L ) { L=length} }END{ print L}'
Bạn cũng có thể chuyển trực tiếp một số tệp vào awk:
awk '{ if ( length > L ) { L=length} }END{ print L}' ./*
Tất nhiên, có thể có một số cảnh báo nếu các tệp trong thư mục thực tế nhưng nó sẽ vô hại. Bạn có thể gặp vấn đề lớn hơn với các tệp nhị phân vì chúng không có khái niệm về dòng . Vì vậy, để cụ thể hơn, bạn có thể làm một cái gì đó như
awk '{ if ( length > L ) { L=length} }END{ print L}' ./*.txt
để chỉ khớp với các .txt
tập tin trong thư mục hiện tại.
Và, như @ G-Man đã nêu trong nhận xét của mình, *
sẽ không khớp các tệp ẩn (bắt đầu bằng dấu chấm). Nếu bạn muốn những cái đó, sử dụng * .*
.
Nếu bạn muốn độ dài tối đa cho mỗi tệp, với GNU awk:
find . -type f -exec awk -v l=0 '
length>l {l=length} ENDFILE{print FILENAME ":", l; l=0}' {} +
Hoặc độ dài tối đa trong tất cả các tệp:
find . -type f -size +1c -exec cat {} + |
awk -v l=0 'length>l {l=length}; END{print l}'
Giả sử các tập tin kết thúc bằng ký tự dòng mới. Nếu một tệp không kết thúc bằng một ký tự dòng mới, thì dòng không phân tách cuối cùng của nó sẽ được hợp nhất với dòng đầu tiên của tệp tiếp theo và có thể làm mất kết quả của bạn.
-size +1c
là một tối ưu hóa vì các tệp văn bản trống hoặc chỉ chứa một ký tự có 0 dòng tương ứng và 1 dòng trống, vì vậy sẽ không có dòng dài nhất.
Ngoài ra với GNU wc (coreutils 8.4), nó có thể xử lý nhiều tệp
wc -L *.txt
wc -L
, nhưng giải pháp của bạn có nhược điểm là bạn phải lội qua độ dài tối đa của tất cả các tệp khác trước. Có bất kỳ lợi thế trong đó?
cat * .* | ...
. Hoặc loại bỏ việc sử dụng mèo vô dụng và nóiawk '...' * .*
.