GNU/Linux >> Belajar Linux >  >> Linux

Apakah ada yang lebih cepat dari `find . | wc -l` untuk menghitung file dalam direktori?

Bukan percepatan mendasar tapi setidaknya sesuatu :)

find . -printf \\n | wc -l

Anda benar-benar tidak perlu melewati daftar nama file, cukup baris baru saja. Varian ini sekitar 15% lebih cepat di Ubuntu 12.04.3 saya ketika direktori di-cache di RAM. Selain itu varian ini akan bekerja dengan benar dengan nama file yang mengandung baris baru.

Menariknya varian ini tampaknya sedikit lebih lambat dari yang di atas:

find . -printf x | wc -c

Kasus khusus - tetapi sangat cepat

Jika direktori berada pada sistem filenya sendiri, Anda cukup menghitung inode:

df -i .

Jika jumlah direktori dan file di direktori lain selain yang dihitung tidak banyak berubah, Anda cukup mengurangi angka yang diketahui ini dari df -i saat ini hasil. Dengan cara ini Anda dapat menghitung file dan direktori dengan sangat cepat.


Saya telah menulis ffcnt untuk tujuan itu. Itu mengambil sendiri offset fisik dari direktori dengan fiemap ioctl dan kemudian menjadwalkan traversal direktori dalam beberapa lintasan berurutan untuk mengurangi akses acak. Apakah Anda benar-benar mendapatkan percepatan dibandingkan dengan find | wc tergantung pada beberapa faktor:

  • tipe sistem file:sistem file seperti ext4 yang mendukung fiemap ioctl akan sangat diuntungkan
  • kecepatan akses acak:HDD jauh lebih bermanfaat daripada SSD
  • tata letak direktori:semakin tinggi jumlah direktori bertingkat, semakin besar potensi pengoptimalan

(kembali)memasang dengan relatime atau bahkan nodiratime juga dapat meningkatkan kecepatan (untuk semua metode) ketika akses sebaliknya akan menyebabkan pembaruan metadata.


Sebenarnya, di sistem saya (Arch Linux) perintah ini

   ls -A | wc -l

lebih cepat dari semua yang di atas:

   $ time find . | wc -l
  1893

   real    0m0.027s
   user    0m0.004s
   sys     0m0.004s
   $ time find . -printf \\n  | wc -l
   1893

   real    0m0.009s
   user    0m0.000s
   sys     0m0.008s
   $ time find . -printf x  | wc -c
   1893

   real    0m0.009s
   user    0m0.000s
   sys     0m0.008s
   $ time ls -A | wc -l
   1892

   real    0m0.007s
   user    0m0.000s
   sys     0m0.004s

Linux
  1. Hitung baris semua file di direktori Ubuntu

  2. Hitung baris dalam file besar

  3. rsync N file terbaru dalam direktori

  1. Cara Menghitung Jumlah File dan Subdirektori di dalam Direktori yang Diberikan

  2. Bagaimana Cara Mendapatkan Hitungan File Dalam Direktori Menggunakan Baris Perintah?

  3. File Cat Dengan Direktori?

  1. Menghapus File Berdasarkan Usia?

  2. Apa Cara Terbaik Untuk Menghitung Jumlah File Dalam Direktori?

  3. Bagaimana Menghitung Jumlah File Dalam Sebuah Direktori Dan Menghapus Yang Terlama Jika Jumlahnya Melebihi 5?