Jawaban:
Anda harus menggunakan perintah seperti ini:
find /group/book/four/word/ -type f -exec wc -l {} + | sort -rn
find
: cari file di jalur yang Anda inginkan. Jika Anda tidak menginginkannya bersifat rekursif, dan find
implementasi Anda mendukungnya, Anda harus menambahkan -maxdepth 1
sebelum -exec
opsi.exec
: memberi tahu perintah untuk mengeksekusi wc -l
pada setiap file.sort -rn
: urutkan hasil secara numerik dalam urutan terbalik. Dari yang lebih besar ke yang lebih rendah.(yang menganggap nama file tidak mengandung karakter baris baru).
wc
juga akan mencetak satu total
baris, jadi di sini Anda juga akan mendapatkan satu atau lebih "total" baris kecuali hanya ada satu file . Anda dapat mengirim ke grep /
untuk menghapusnya.
sort
perintah
Mungkin versi paling sederhana jika Anda tidak perlu rekursif:
wc -l /group/book/four/word/*|sort -n
wc
menghitung baris (opsi -l
) di setiap (tetapi tersembunyi) ( *
) file di bawah /group/book/four/word/
, dan sort
mengurutkan hasilnya (melalui pipa |
) secara numerik (opsi -n
).
Seseorang membuat komentar untuk jawaban ini grep -rlc
, sebelum menekannya. Memang grep
merupakan alternatif yang bagus, terutama jika Anda membutuhkan rekursif:
grep -rc '^' /group/book/four/word/|tr ':' ' '|sort -n -k2
akan menghitung (opsi -c
) rekursif (opsi -r
) baris yang cocok ( grep
) '^'
(yaitu, awal baris) dalam direktori /group/book/four/word/
. Kemudian Anda harus mengganti titik dua dengan spasi, misalnya menggunakan tr
, untuk membantu sort
, yang ingin Anda urutkan secara numerik (opsi -n
) pada kolom kedua (opsi -k2
).
Pembaruan: Lihat komentar Stephane tentang batasan yang mungkin dan bagaimana Anda dapat benar-benar dihilangkan tr
.
grep -c .
menghitung garis yang mengandung setidaknya satu karakter yang valid. Gunakan grep -c '^'
untuk menghitung semua baris (juga akan menghitung karakter tambahan setelah baris baru terakhir dengan beberapa grep
implementasi). Perhatikan bahwa tidak semua grep
implementasi mendukung -r
dan perilaku bervariasi di antara yang melakukannya. Anda tidak perlu menerjemahkan :
s (titik dua, bukan titik koma) ke spasi sort
. Gunakan saja -t:
. Perhatikan bahwa asumsi bahwa nama file tidak mengandung :
atau kosong atau karakter baris baru.
wc
memberikan semua yang berguna jika Anda melewati banyak jalur. Menggabungkan fungsi itu dengan wild card dan pipa ke sort
benar-benar bersih.
Dengan zsh
:
lines() REPLY=$(wc -l < $REPLY)
printf '%s\n' /group/book/four/word/*(.no+lines)
Kami mendefinisikan fungsi penyortiran baru lines
yang menjawab dengan jumlah baris dalam file. Dan kami menggunakan o+lines
kualifikasi glob yang bersama-sama dengan n
(untuk jenis numerik), menentukan bagaimana hasil glob tersebut dipesan. ( .
juga ditambahkan hanya untuk memeriksa file biasa).
Itu tidak membuat asumsi pada karakter apa nama file dapat berisi selain file tersembunyi (yang dimulai dengan .
) dihilangkan. Tambahkan D
kualifikasi glob jika Anda menginginkannya juga.
bash
...
Anda tidak menentukan apakah Anda juga ingin file dalam subdirektori dari /group/book/four/word
. The find
solusi dalam jawaban jherran akan turun ke subdirektori. Jika itu tidak diinginkan, gunakan shell sebagai gantinya:
for file in ./*; do [ -f "$file" ] && wc -l "$file"; done | sort -n
Jika nama file Anda dapat berisi baris baru, Anda dapat menggunakan sesuatu seperti:
for file in ./*; do
[ -f "$file" ] &&
printf "%lu %s\0" "$(wc -l < "$file")" "$file"
done | sort -zn | tr '\0' '\n'
Akhirnya, jika Anda lakukan mau turun ke subdirektori, Anda dapat menggunakan ini dalam bash
4 atau di atas:
shopt -s globstar
for file in ./**/*; do [ -f "$file" ] && wc -l "$file"; done | sort -n
Perhatikan bahwa versi bash
sebelum 4.3 mengikuti symlink ketika secara turun menurun pohon direktori (seperti zsh
's atau tcsh
' s ***/*
).
Selain itu, semua solusi di atas akan mengabaikan file tersembunyi (yang namanya dimulai dengan a .
, gunakan shopt -s dotglob
untuk memasukkannya) dan juga akan menyertakan jumlah baris tautan simbolik (yang find
pendekatannya tidak akan).
-xtype f
di GNU find atau *(-.)
di zsh) dan akan menghilangkan file tersembunyi.
%lu
di printf
? Seingat saya, itu berarti desimal yang tidak ditandatangani, apakah itu benar-benar diperlukan? Mengapa tidak memperlakukan nomor sebagai string? Apakah itu membuat perbedaan?
0
bukan string kosong, yang sedikit lebih baik. Beberapa implementasi semacam bekerja dengan bilangan bulat yang tidak ditandatangani, beberapa dengan yang ditandatangani. %lu
kedengarannya seperti taruhan teraman, tetapi mungkin tidak masalah seolah-olah Anda memiliki 2^31
garis, itu akan memakan waktu lama.
Jika Anda ingin menginstal fd
file finder yang sangat cepat yang ditulis dalam Rust (Anda harus menginstalnya, itu bagus untuk dimiliki)
fd --type=file . | xargs wc -l | sort -n
Pada dasarnya fd
daftar file, xargs akan meneruskan daftar file ke wc
(singkatan dari jumlah kata tetapi melewati -l akan membuatnya menghitung baris) kemudian akhirnya diurutkan dari paling sedikit jumlah baris ke penggunaan terbesar sort -n
.
ls -l
tidak memberikan jumlah baris.ls -lS
mengurutkan file berdasarkan ukuran dengan beberapals
implementasi ( ukuran menjadi jumlah byte dalam konten).