UPDATE : Catatan tentang menggunakan opsi regex locs vs ekspansi nama file shell dalam kaitannya dengan argumen loc ...
SHELL FILENAME EXPANSION
Saat Anda mengetik locate /bin/b*
(perhatikan tidak ada tanda kutip), beberapa hal terjadi.
- Pertama, ekspansi nama file shell akan memperluas charecter pola shell khusus * (Ini karena * tidak terlindungi, mis. Tidak ada "tanda kutip ganda")
- Ekspansi yang dihasilkan ini adalah daftar nama file . yang mungkin sangat panjang ... Daftar ini diteruskan ke
locate
banyak argumen perintah individu.
locate
kemudian menguji setiap argumen ini terhadap masing-masing file dalam database-nya, dan hasilnya sesuai.
Namun perhatikan, 'lokasi' tidak memiliki konsep direktori kerja saat ini. Ini hanya cocok dengan argumen Anda terhadap nama file yang sepenuhnya memenuhi syarat dalam database-nya.
Ini berarti bahwa itu akan cocok dengan keduanya /bin/bash
dan /home/user/bin/brackets
Anda memiliki tingkat kontrol seperti ini, tetapi pencarian regex pencari menawarkan lebih banyak; seperti halnya beberapa opsi loc lainnya.
LOKASI OPSI REGEX
Ketika Anda mengetik locate -r "/bin/b.*"
hal-hal yang berbeda terjadi daripada yang dilakukan dengan argumen sederhana .. ( shell-extended-args hanyalah daftar argumen sederhana)
- The
-r
pilihan memberitahu mencari untuk mengobati arg Anda sebagai pola regex.
- Tanda kutip melindungi * dari ekspansi nama file shell. Ini berarti bahwa * dan titik. sekarang karakter regex khusus
- Menjadi regex, Anda dapat dengan mudah memberi tahu 'locas' agar sesuai dengan entri basis datanya dengan berbagai cara: eg1.
locate -r "^/bin/b.*"
menghasilkan nama file yang dimulai dengan / bin / b ... eg2. locate -r ~/"bin/b.*"
menghasilkan nama file yang diawali dengan / home / user / bin / b .. Perhatikan bahwa ~ / tidak dilindungi oleh "tanda kutip" dan karena itu tunduk pada ekspansi shell tilde yang mengkonversi ~ / ke / home / user /
Ringkasan: "ekspansi namafile shell" sangat berbeda dengan 'regex'
Sekarang kembali ke pos asli:
locate
biasanya mencantumkan seluruh basis data ke stdout, jadi untuk membatasinya ke direktori tertentu Anda perlu memfilternya ... Anda dapat melakukan ini melalui opsi temukan.
Anda dapat menggunakan kemampuan regex loc, daripada hanya shell-globbing ... ( locate /dir/myfile*
adalah shell-globbing) ...
Dari informasi mencari : -r
,--regex
- "... (regex) kecocokan dilakukan terhadap seluruh nama jalur, dan karenanya secara default nama path akan cocok jika ada bagian yang cocok dengan ekspresi reguler yang ditentukan. Ekspresi reguler dapat menggunakan ^ atau $ untuk mengaitkan kecocokan di awal atau akhir nama path. "
note: -i = abaikan case
. . . . . -r = regex
. . . . . ~ / akan diperluas oleh shell ke / home / pengguna (ketika ~ / tidak dalam tanda kutip)
. . . . . '\' (ruang baskslash +; tidak ada tanda kutip) adalah ruang literal (untuk menghindari ekspansi shell). Anda dapat memasukkan string ke dalam tanda kutip, tetapi pastikan untuk meninggalkan tanda ~ / di luar tanda kutip: ~/my\ regex
atau-/"my regex"
misalnya. locate -ir ~/".*"la\ bella\ vita
sama dengan locate -ir ~/".*la bella vita"
dan akan mencari seluruh direktori home Anda untuk "La Bella Vita" yang terjadi di mana saja.
Anda juga dapat membatasi pencarian hanya nama file tetapi menggunakan -b
atau --basename
.. dalam hal ini regex awal-line- ^
berlaku hanya untuk nama file ...
Saya paling sering menemukan diri saya menggunakan locate -bir
PS .. Locate
sangat cepat, bahwa saya tidak pernah menggunakan find
... saya juga tidak pernah menggunakan pencarian nautilus (terlalu lambat)
Dengan 'cari', jika Anda mencari sesuatu yang baru ditambahkan, jalankan saja sudo updatedb
untuk menyegarkan basis data loc ... (tetapi jika Anda baru saja menambahkannya, Anda mungkin tahu di mana tempatnya:) ....
locate
melakukanO(log(n))
pencarianlocatedb
ketika Anda memberikan permintaan pencarian non-regex, maka Anda dapat menggunakangrep
regex untuk melakukanO(m)
pencarian pada sub-hasil yang sudah berkurang. (n = jumlah total entri dalamlocatedb
[yaitu semua file drive Anda], m = # entri yang kurang cocok dengan Andalocatedb
), kompleksitas berjalan total:, diO(log(n)) + O(m)
mana m rata-ratalog(n)
, sehingga Anda mendapatkan2*O(log(n))
, sebagai lawanO(n)
ketika Anda melakukan permintaan regex atas semua entri dilocatedb
.O(log(n))
sementara pencarian regex adalahO(n)
? Jumlah entri dalam db sama di setiap kasus. Saya kira itu adalah algoritma pencarian?Anda dapat menggunakan.
locate /rootpath/*filenamespec
Saya belum mencobanya sebelumnya, tetapi tampaknya berhasil. Untuk melakukan contoh Anda, itu akan menjadilocate /home/tim/science/*math*
Anda mungkin ingin melihat
find
perintah daripadalocate
perilaku semacam itu. Sintaksnya adalahfind rootforsearch -name filenamepattern -print
. Dalam hal ini, contoh Anda akan memerlukan.find /home/tim/science -name *math* -print
Tidak secepat mencari karena tidak ada database untuk mencari ... itu benar-benar mencari sistem file. Ada banyak opsi yang bisa Anda gunakan selain mencetak juga, jika Anda bermaksud melakukan sesuatu dengan file tersebut.sumber
locate
sendiri (tidak memerlukan utilitas lain sepertigrep
) dan tidak tanpa regexps (yang bagus, tetapi tidak perlu dalam kasus ini).Bagi saya yang paling nyaman adalah
sumber