Tidak jarang saya harus menghitung jumlah file dalam suatu direktori, terkadang ini mencapai jutaan.
Apakah ada cara yang lebih baik dari sekadar menghitung dan menghitungnya find . | wc -l
? Apakah ada semacam panggilan filesystem yang dapat Anda lakukan pada ext3 / 4 yang kurang I / O intensif?
linux
filesystems
find
ext4
MattPark
sumber
sumber
find -maxdepth 1
. Perhatikan bahwa dengan pendekatan Anda saat ini, Anda akan menghitung ulang nama apa pun yang berisi karakter baris baru.Jawaban:
Bukan kecepatan dasar tetapi setidaknya sesuatu :)
Anda benar-benar tidak perlu melewati daftar nama file, cukup baris baru saja. Varian ini sekitar 15% lebih cepat pada Ubuntu 12.04.3 saya ketika direktori di-cache dalam RAM. Selain itu varian ini akan berfungsi dengan benar dengan nama file yang mengandung baris baru.
Menariknya varian ini tampaknya sedikit lebih lambat daripada yang di atas:
Kasus khusus - tetapi sangat cepat
Jika direktori berada pada sistem file sendiri, Anda dapat menghitung inode:
Jika jumlah direktori dan file di direktori lain dari yang dihitung tidak banyak berubah, Anda cukup mengurangi angka yang diketahui ini dari
df -i
hasil saat ini . Dengan cara ini Anda akan dapat menghitung file dan direktori dengan sangat cepat.sumber
time find /usr/src/ -printf \\n | wc -l
, Anda dapat menghapus cache di sela-sela run dengansudo sync && sudo sysctl -w vm.drop_caches=3
-printf x
harus sama dengan-printf '\0'
? Saya tidak melihatnya disebutkan dalam dokumen.-printf
bekerja mirip denganprintf()
fungsi dalam C dengan perbedaan utama bahwa%
arahan memiliki makna yang berbeda. Tindakan ini dipanggil untuk setiap file yang ditemukan. Ini berarti bahwa-printf x
akan mencetak karakterx
untuk setiap file yang ditemukan (coba saja!) Dan-printf '\0'
akan mencetak karakter NULL (kode ASCII 0) untuk setiap file yang ditemukan.-printf '\0'
tidak memiliki arti khusus. Keduanya akan bekerja sama dalam contoh denganwc -c
jawaban ini.Saya telah menulis ffcnt untuk tujuan itu. Ia mengambil offset fisik direktori itu sendiri dengan
fiemap
ioctl dan kemudian menjadwalkan direktori traversal dalam beberapa urutan berurutan untuk mengurangi akses acak. Apakah Anda benar-benar mendapatkan speedup dibandingkan denganfind | wc
tergantung pada beberapa faktor:fiemap
ioctl akan mendapat manfaat paling besar(re) pemasangan dengan
relatime
atau bahkannodiratime
juga dapat meningkatkan kecepatan (untuk semua metode) ketika akses sebaliknya akan menyebabkan pembaruan metadata.sumber
Sebenarnya, pada sistem saya (Arch Linux) perintah ini
lebih cepat dari semua yang di atas:
sumber
/bin/ls: Argument list too long
jika Anda menggunakan globbing, tetapi sekali lagi ia dapat beroperasi secara rekursif seperti menemukan juga, jadi mungkin itu adalah sesuatu yang perlu dipertimbangkan, jangan gunakan menemukan jika tidak diperlukan.ls -A
hanya daftar file dalam direktori saat ini sementarafind
tanpa-maxdepth 1
argumen akan membuat pencarian rekursif melalui semua subdirektori.