Antworten:
Die einfachste Lösung besteht darin, alle Dateien zu verketten und das Ergebnis an Ihr Skript weiterzuleiten:
cat ./* | awk '{ if ( length > L ) { L=length} }END{ print L}'
Sie können auch mehrere Dateien direkt an awk übergeben:
awk '{ if ( length > L ) { L=length} }END{ print L}' ./*
Natürlich kann es einige Warnungen geben, wenn Dateien tatsächlich Verzeichnisse sind, aber es sollte harmlos sein. Sie haben möglicherweise größere Probleme mit Binärdateien, da sie kein Linienkonzept haben . Um genauer zu sein, können Sie so etwas tun
awk '{ if ( length > L ) { L=length} }END{ print L}' ./*.txt
um nur die .txt
Dateien im aktuellen Verzeichnis abzugleichen.
Und, wie @ G-Man in seinem Kommentar feststellte, *
werden keine versteckten Dateien gefunden (beginnend mit einem Punkt). Wenn Sie diese möchten, verwenden Sie * .*
.
Wenn Sie die maximale Länge pro Datei mit GNU awk wollen:
find . -type f -exec awk -v l=0 '
length>l {l=length} ENDFILE{print FILENAME ":", l; l=0}' {} +
Oder die maximale Länge in allen Dateien:
find . -type f -size +1c -exec cat {} + |
awk -v l=0 'length>l {l=length}; END{print l}'
Dies setzt voraus, dass die Dateien mit Zeilenumbrüchen enden. Wenn eine Datei nicht mit einem Zeilenumbruch endet, wird die letzte nicht begrenzte Zeile mit der ersten Zeile der nächsten Datei zusammengeführt und das Ergebnis möglicherweise ungültig.
-size +1c
ist eine Optimierung, da Textdateien, die leer sind oder nur ein Zeichen enthalten, jeweils 0 Zeilen und 1 Leerzeile haben, also nicht die längste Zeile haben.
Auch mit GNU wc (coreutils 8.4) können mehrere Dateien verarbeitet werden
wc -L *.txt
wc -L
tut, aber Ihre Lösung hat den Nachteil , dass Sie durch die Maximallänge aller anderen Dateien zuerst waten. Hat das einen Vorteil?
cat * .* | ...
. Oder beseitigen Sie den nutzlosen Gebrauch der Katze und sagen Sieawk '...' * .*
.