Risposte:
La soluzione più semplice è concatenare tutti i file e reindirizzare il risultato allo script:
cat ./* | awk '{ if ( length > L ) { L=length} }END{ print L}'
Puoi anche passare direttamente diversi file a awk:
awk '{ if ( length > L ) { L=length} }END{ print L}' ./*
Naturalmente, possono esserci alcuni avvisi se i file sono in realtà directory ma dovrebbero essere innocui. Potresti avere problemi più grandi con i file binari perché non hanno un concetto di linea . Quindi, per essere più specifici, puoi fare qualcosa di simile
awk '{ if ( length > L ) { L=length} }END{ print L}' ./*.txt
per abbinare solo il .txt
file nella directory corrente.
E, come affermato da @ G-Man nel suo commento, *
non corrisponderà ai file nascosti (iniziando con un punto). Se vuoi quelli, usa * .*
.
Se vuoi la lunghezza massima per file, con GNU awk:
find . -type f -exec awk -v l=0 '
length>l {l=length} ENDFILE{print FILENAME ":", l; l=0}' {} +
O l'unica lunghezza massima in tutti i file:
find . -type f -size +1c -exec cat {} + |
awk -v l=0 'length>l {l=length}; END{print l}'
Ciò presuppone che i file finiscano con caratteri di nuova riga. Se un file non termina con un carattere di nuova riga, la sua ultima riga non delimitata verrà unita alla prima riga del file successivo e probabilmente annullerà il risultato.
-size +1c
è un'ottimizzazione poiché i file di testo che sono vuoti o che contengono solo un carattere hanno rispettivamente 0 righe e 1 riga vuota, quindi non avranno la riga più lunga.
Anche con GNU wc (coreutils 8.4), può gestire più file
wc -L *.txt
wc -L
fa, ma la soluzione ha lo svantaggio che si deve guadare attraverso il max-lunghezza di tutti gli altri file prima. C'è qualche vantaggio in questo?
cat * .* | ...
. Oppure elimina l' uso inutile del gatto e dilloawk '...' * .*
.