Jawaban:
Solusi paling mudah adalah menggabungkan semua file dan menyalurkan hasilnya ke skrip Anda:
cat ./* | awk '{ if ( length > L ) { L=length} }END{ print L}'
Anda juga dapat mengirimkan langsung beberapa file ke awk:
awk '{ if ( length > L ) { L=length} }END{ print L}' ./*
Tentu saja, ada beberapa peringatan jika file sebenarnya adalah direktori tetapi seharusnya tidak berbahaya. Anda mungkin memiliki masalah yang lebih besar dengan file biner karena mereka tidak memiliki konsep garis . Jadi, agar lebih spesifik, Anda dapat melakukan sesuatu seperti
awk '{ if ( length > L ) { L=length} }END{ print L}' ./*.txt
hanya untuk mencocokkan .txt
file dalam direktori saat ini.
Dan, seperti yang dinyatakan oleh @ G-Man dalam komentarnya, *
tidak akan cocok dengan file yang tersembunyi (dimulai dengan titik). Jika Anda menginginkannya, gunakan * .*
.
Jika Anda ingin panjang maksimal per file, dengan GNU awk:
find . -type f -exec awk -v l=0 '
length>l {l=length} ENDFILE{print FILENAME ":", l; l=0}' {} +
Atau satu panjang maksimal di semua file:
find . -type f -size +1c -exec cat {} + |
awk -v l=0 'length>l {l=length}; END{print l}'
Itu mengasumsikan file berakhir dalam karakter baris baru. Jika satu file tidak berakhir dengan karakter baris baru, maka baris non-dibatasi terakhirnya akan digabungkan dengan baris pertama dari file berikutnya dan mungkin membatalkan hasil Anda.
-size +1c
adalah pengoptimalan karena file teks yang kosong atau hanya berisi satu karakter masing-masing memiliki 0 baris dan 1 baris kosong, sehingga tidak akan memiliki baris terpanjang.
Juga dengan GNU wc (coreutils 8.4), ia dapat menangani banyak file
wc -L *.txt
wc -L
tidak, tapi solusi Anda memiliki kelemahan yang Anda harus menyeberang melalui max-panjang semua file lain pertama. Apakah ada manfaatnya?
cat * .* | ...
,. Atau hilangkan penggunaan kucing yang tidak berguna dan katakanawk '...' * .*
.