Gunakan "cari" di bawah direktori tertentu?

46

Saya bertanya-tanya bagaimana cara membatasi rentang pencarian "temukan" ke beberapa direktori?

Sebagai contoh, bagaimana menemukan file / direktori dengan string "matematika" di nama mereka di bawah beberapa direktori "/ home / tim / science /"?

Terima kasih dan salam!

Tim
sumber

Jawaban:

30

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.

  1. Pertama, ekspansi nama file shell akan memperluas charecter pola shell khusus * (Ini karena * tidak terlindungi, mis. Tidak ada "tanda kutip ganda")
  2. Ekspansi yang dihasilkan ini adalah daftar nama file . yang mungkin sangat panjang ... Daftar ini diteruskan ke locatebanyak argumen perintah individu.
  3. 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)

  1. The -rpilihan memberitahu mencari untuk mengobati arg Anda sebagai pola regex.
  2. Tanda kutip melindungi * dari ekspansi nama file shell. Ini berarti bahwa * dan titik. sekarang karakter regex khusus
  3. 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\ regexatau-/"my regex"

misalnya. locate -ir ~/".*"la\ bella\ vitasama 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 -batau --basename.. dalam hal ini regex awal-line- ^berlaku hanya untuk nama file ...

Saya paling sering menemukan diri saya menggunakan locate -bir

PS .. Locatesangat 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 updatedbuntuk menyegarkan basis data loc ... (tetapi jika Anda baru saja menambahkannya, Anda mungkin tahu di mana tempatnya:) ....

Peter.O
sumber
13

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.

Adam Byrtek
sumber
@ Adam .. Jangan meremehkan metode Anda; itu cukup oke, tetapi Anda dapat menggunakan regex locus sendiri alih-alih perpipaan untuk grep .. Metode "lain" yang Anda lihat tidak menggunakan regex dan berperilaku sangat berbeda .... Saya telah menambahkan beberapa detail tentang perbedaan pada saya jawab ...
Peter.O
2
cari lebih sedikit | grep ^ / bin jauh lebih cepat daripada loc -r ^ / bin /.* kurang, karena loc kurang akan melakukan pencarian yang efisien untuk kata kurang, dan loc -r akan melakukan operasi regex pada semua entri di locatedb
Marcel Valdez Orozco
@MarcelValdezOrozco Apa itu "pencarian kata yang efisien" dan mengapa lebih cepat daripada regex?
Flashrunner
@ Flashrunner Karena locatemelakukan O(log(n))pencarian locatedbketika Anda memberikan permintaan pencarian non-regex, maka Anda dapat menggunakan grepregex 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.
Marcel Valdez Orozco
@MarcelValdezOrozco Tapi mengapa pencarian non-regex lebih dari db O(log(n))sementara pencarian regex adalah O(n)? Jumlah entri dalam db sama di setiap kasus. Saya kira itu adalah algoritma pencarian?
Flashrunner
8

Anda dapat menggunakan. locate /rootpath/*filenamespecSaya belum mencobanya sebelumnya, tetapi tampaknya berhasil. Untuk melakukan contoh Anda, itu akan menjadilocate /home/tim/science/*math*

Anda mungkin ingin melihat findperintah daripada locateperilaku semacam itu. Sintaksnya adalah find rootforsearch -name filenamepattern -print. Dalam hal ini, contoh Anda akan memerlukan. find /home/tim/science -name *math* -printTidak 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.

Nerdfest
sumber
Ini adalah jawaban terbaik karena menggunakan locatesendiri (tidak memerlukan utilitas lain seperti grep) dan tidak tanpa regexps (yang bagus, tetapi tidak perlu dalam kasus ini).
Tom
Yang ini bekerja sangat seperti pesona yang dapat Anda gunakan temukan untuk mencari file di Path direktori tertentu, terima kasih @Nerdfest
amit_game
1

Bagi saya yang paling nyaman adalah

cd /home/tim/science
locate math | grep `pwd`
alex440
sumber
Apakah Anda benar-benar membaca pertanyaannya?
Tessaracter