Saya ingin menggunakan "temukan" dan temukan "untuk mencari file sumber di proyek saya, tetapi mereka membutuhkan waktu lama untuk dijalankan. Apakah ada alternatif yang lebih cepat untuk program ini yang tidak saya ketahui, atau cara untuk mempercepat kinerja program-program ini?
22
locate
seharusnya sudah banyak cepat, mengingat itu menggunakan indeks pra-dibangun (peringatan utama adalah bahwa itu harus tetap up to date), sementarafind
harus membaca daftar direktori.find /usr/src -name fprintf.c
mesin desktop OpenBSD saya, ia mengembalikan lokasi file sumber tersebut dalam waktu kurang dari 10 detik.locate fprintf.c | grep '^/usr/src.*/fprintf.c$'
kembali di bawah satu detik. Apa definisi Anda tentang "waktu yang lama untuk menjalankan" dan bagaimana Anda menggunakanfind
danlocate
?Jawaban:
Mencari file sumber dalam suatu proyek
Gunakan perintah yang lebih sederhana
Secara umum, sumber untuk suatu proyek kemungkinan berada di satu tempat, mungkin di beberapa subdirektori bersarang tidak lebih dari dua atau tiga dalam, sehingga Anda dapat menggunakan (mungkin) perintah yang lebih cepat seperti
Manfaatkan metadata proyek
Dalam proyek C Anda biasanya memiliki Makefile. Dalam proyek lain, Anda mungkin memiliki sesuatu yang serupa. Ini bisa menjadi cara cepat untuk mengekstrak daftar file (dan lokasi mereka) menulis skrip yang memanfaatkan informasi ini untuk mencari file. Saya memiliki skrip "sumber" sehingga saya dapat menulis perintah seperti
grep variable $(sources programname)
.Mempercepat menemukan
Cari lebih sedikit tempat, alih-alih
find / …
gunakanfind /path/to/project …
jika memungkinkan. Sederhanakan kriteria seleksi sebanyak mungkin. Gunakan pipa untuk menunda beberapa kriteria pemilihan jika itu lebih efisien.Anda juga dapat membatasi kedalaman pencarian. Bagi saya, ini meningkatkan kecepatan 'menemukan' banyak. Anda dapat menggunakan sakelar -maxdepth. Misalnya '-maxdepth 5'
Mempercepat lokasi
Pastikan itu mengindeks lokasi yang Anda minati. Baca halaman manual dan manfaatkan opsi apa pun yang sesuai dengan tugas Anda.
Hapus kebutuhan untuk mencari
Mungkin Anda mencari karena Anda lupa di mana sesuatu itu atau tidak diberitahu. Dalam kasus sebelumnya, tulis catatan (dokumentasi), dalam kasus terakhir, tanyakan? Konvensi, standar, dan konsistensi dapat banyak membantu.
sumber
Saya menggunakan bagian "mempercepat lokasi" dari jawaban RedGrittyBrick. Saya membuat db lebih kecil:
lalu menunjuk
locate
itu:locate -d /home/benhsu/ben.db
sumber
Taktik yang saya gunakan adalah menerapkan
-maxdepth
opsi denganfind
:Ulangi dengan kedalaman yang lebih dalam sampai Anda menemukan apa yang Anda cari, atau Anda bosan melihatnya. Beberapa iterasi pertama cenderung kembali secara instan.
Ini memastikan bahwa Anda tidak membuang waktu di muka melihat melalui kedalaman sub-pohon besar ketika apa yang Anda cari cenderung berada di dekat pangkal hierarki.
Berikut ini contoh skrip untuk mengotomatiskan proses ini (Ctrl-C ketika Anda melihat apa yang Anda inginkan):
Perhatikan bahwa redundansi bawaan yang terlibat (setiap pass harus melintasi folder yang diproses pada pass sebelumnya) sebagian besar akan dioptimalkan jauh melalui cache disk.
Mengapa tidak
find
mencari pesanan ini sebagai fitur bawaan? Mungkin karena itu akan rumit / tidak mungkin untuk diterapkan jika Anda berasumsi bahwa traversal yang berlebihan tidak dapat diterima. Adanya-depth
opsi mengisyaratkan kemungkinan, tapi sayangnya ...sumber
Solusi mudah lainnya adalah dengan menggunakan globbing shell diperpanjang yang baru. Untuk mengaktifkan:
Kemudian, Anda dapat menjalankan perintah seperti ini di direktori sumber tingkat atas:
Ini memiliki keuntungan yang dicari secara rekursif melalui semua subdirektori dan sangat cepat.
sumber
Pencari Perak
Anda mungkin menemukan itu berguna untuk mencari dengan sangat cepat konten dari sejumlah besar file kode sumber. Cukup ketik
ag <keyword>
. Berikut beberapa output dari sayaapt show silversearcher-ag
:Saya biasanya menggunakannya dengan:
sumber
.gitignore
file dan melompat.git
,.svn
,.hg
.. folder..gitignore
dan mengabaikan file tersembunyi dan biner secara default. Juga memiliki lebih banyak kontributor, lebih banyak bintang di Github (14700 vs 8300) dan sudah ada di repo walikota. Harap berikan perbandingan sumber pihak ketiga yang dapat diperbarui dan dapat diperbarui. Meskipun demikian,ripgrep
tampak perangkat lunak yang hebat.ripgrep
dalam cara apa pun, itu hanya sesuai dengan kebutuhan saya, jadi saya berhenti mencari opsi lain..gitignore
juga menghormati . Yang mengatakan,rg
benar-benar luar biasa. Pertama, ia memiliki dukungan unicode. Dalam pengalaman sayarg
secara konsisten setidaknya dua kali lebih cepatag
(YMMV), saya kira itu karena parser regex Rust, yang jelas belum siap namun pada tahun-tahunag
yang baru itu baru.rg
dapat memberikan output deterministik (tetapi tidak secara default), ia dapat membuat daftar hitam jenis file yangag
hanya dapat memasukkan daftar putih, dapat mengabaikan file berdasarkan ukuran (bye bye logs). Saya masih menggunakanag
kalau-kalau saya perlu pencocokan multiline, yangrg
tidak bisa dilakukan.Untuk mencari pengganti, lihat fd . Ini memiliki antarmuka yang lebih sederhana / lebih intuitif daripada perintah find asli, dan sedikit lebih cepat.
sumber