Yanıtlar:
En basit çözüm tüm dosyaları birleştirmek ve sonucu betiğinize bağlamaktır:
cat ./* | awk '{ if ( length > L ) { L=length} }END{ print L}'
Ayrıca awk için doğrudan birkaç dosya iletebilirsiniz:
awk '{ if ( length > L ) { L=length} }END{ print L}' ./*
Tabii ki, dosyalar aslında dizinler ise bazı uyarılar olabilir, ancak zararsız olmalıdır. İkili dosyalar ile daha büyük sorunlarınız olabilir, çünkü bir satır kavramı yoktur . Yani, daha spesifik olmak için,
awk '{ if ( length > L ) { L=length} }END{ print L}' ./*.txt
yalnızca .txtgeçerli dizindeki dosyaları eşleştirmek için .
@ G-Man'nin yorumunda belirttiği gibi, *gizli dosyalarla (nokta ile başlayan) eşleşmeyecek. Bunları istiyorsanız, kullanın * .*.
GNU awk ile dosya başına maksimum uzunluk istiyorsanız:
find . -type f -exec awk -v l=0 '
length>l {l=length} ENDFILE{print FILENAME ":", l; l=0}' {} +
Veya tüm dosyalarda bir maksimum uzunluk:
find . -type f -size +1c -exec cat {} + |
awk -v l=0 'length>l {l=length}; END{print l}'
Bu, dosyaların satırsonu karakterleriyle biteceğini varsayar. Bir dosya yeni satır karakteriyle bitmezse, son sınırlanmamış satırı sonraki dosyanın ilk satırıyla birleştirilir ve muhtemelen sonucunuzu geçersiz kılar.
-size +1c boş veya yalnızca bir karakter içeren metin dosyaları sırasıyla 0 satır ve 1 boş satır içerdiğinden, en uzun satıra sahip olmayacağı için bir optimizasyondur.
Ayrıca GNU wc (coreutils 8.4) ile birden fazla dosyayı işleyebilir
wc -L *.txt
wc -L, ancak çözümünüzün önce tüm diğer dosyaların maksimum uzunluğunda beklemek zorunda olduğu dezavantajı vardır. Bunda bir avantaj var mı?
cat * .* | .... Ya da kedinin gereksiz kullanımını ortadan kaldırın ve söyleyinawk '...' * .*.