Jawaban:
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.
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)
-r
pilihan memberitahu mencari untuk mengobati arg Anda sebagai pola regex. 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
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:) ....
Pipa melalui grep, seperti ini
$ locate less | grep ^/bin
/bin/bzless
/bin/less
/bin/lessecho
/bin/lessfile
/bin/lesskey
/bin/lesspipe
/bin/zless
Sunting: Jawaban lain lebih baik, saya tidak tahu Anda bisa melewati pola untuk menemukan.
locate
melakukan O(log(n))
pencarian locatedb
ketika Anda memberikan permintaan pencarian non-regex, maka Anda dapat menggunakan grep
regex untuk melakukan O(m)
pencarian pada sub-hasil yang sudah berkurang. (n = jumlah total entri dalam locatedb
[yaitu semua file drive Anda], m = # entri yang kurang cocok dengan Anda locatedb
), kompleksitas berjalan total:, di O(log(n)) + O(m)
mana m rata-rata log(n)
, sehingga Anda mendapatkan 2*O(log(n))
, sebagai lawan O(n)
ketika Anda melakukan permintaan regex atas semua entri di locatedb
.
O(log(n))
sementara pencarian regex adalah O(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 daripada locate
perilaku semacam itu. Sintaksnya adalah find 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.
locate
sendiri (tidak memerlukan utilitas lain seperti grep
) dan tidak tanpa regexps (yang bagus, tetapi tidak perlu dalam kasus ini).
Bagi saya yang paling nyaman adalah
cd /home/tim/science
locate math | grep `pwd`