loc vs find: penggunaan, pro dan kontra satu sama lain

Jawaban:

166

locate(1)hanya memiliki satu keunggulan besar find(1): kecepatan.

find(1)Namun, memiliki banyak keunggulan dibandingkan locate(1):

  • find(1)bersifat primordial, kembali ke versi AT&T Unix yang pertama . Anda bahkan akan menemukannya di Linux tertanam yang dipotong melalui Busybox . Semuanya universal.

    locate(1)jauh lebih muda dari find(1). Nenek moyang paling awal locate(1) tidak muncul sampai tahun 1983 , dan itu tidak tersedia secara luas sebagai " locate" sampai tahun 1994, ketika ia diadopsi ke dalam GNU findutils dan menjadi 4.4BSD .

  • locate(1)juga tidak standar , sehingga tidak diinstal secara default di mana-mana. Beberapa tipe OS POSIX bahkan tidak menawarkannya sebagai opsi, dan jika tersedia, implementasinya mungkin kekurangan fitur yang Anda inginkan karena tidak ada standar independen yang menetapkan set fitur minimum yang harus tersedia.

    Ada de facto standar, menjadi BSDlocate(1) , tapi itu hanya karena dua rasa utama lainnya dari locatemenerapkan semua pilihan nya: -0, -c, -d, -i, -l, -m, -s, dan -S. mlocatemengimplementasikan 6 pilihan tambahan yang tidak di BSD locate: -b, -e, -P, -q, --regexdan -w. GNUlocate mengimplementasikan enam ditambah lagi empat : -A, -D, -E, dan -p. (Saya mengabaikan alias dan perbedaan kecil seperti -?vs -hvs. --help)

    BSD dan Mac OS X mengirimkan BSD locate.

    Sebagian besar Linux mengirimkan GNU locate, tetapi Red Hat Linuxes dan Arch mengirim mlocatesebagai gantinya. Debian tidak menginstal baik di instalasi dasarnya, tetapi menawarkan kedua versi dalam repositori paket default; jika keduanya diinstal sekaligus, " locate" berjalan mlocate.

    Oracle telah dikirimkan mlocatedi Solaris sejak 11.2 , dirilis pada Desember 2014. Sebelumnya, locateSolaris tidak diinstal secara default. (Agaknya, ini dilakukan untuk mengurangi ketidakcocokan perintah Solaris dengan Oracle Linux , yang didasarkan pada Red Hat Enterprise Linux , yang juga menggunakan mlocate.)

    IBM AIX masih tidak mengirimkan versi apa pun locate, setidaknya pada AIX 7.2 , kecuali Anda menginstal GNU findutilsdari AIX Toolbox untuk Aplikasi Linux .

    HP-UX juga tampaknya kurang locatedalam sistem dasar.

    Lama "nyata" Unix umumnya tidak mencakup implementasi locate.

  • find(1)memiliki sintaks ekspresi yang kuat, dengan banyak fungsi, operator Boolean , dll.

  • find(1)dapat memilih file dengan lebih dari sekadar nama. Itu dapat memilih dengan:

    • usia
    • ukuran
    • pemilik
    • jenis file
    • cap waktu
    • izin
    • kedalaman dalam subtree ...
  • Saat menemukan file dengan nama, Anda dapat mencari menggunakan sintaks globbing file di semua versi find(1), atau dalam versi GNU atau BSD, menggunakan ekspresi reguler .

    Versi saat ini locate(1)menerima pola glob seperti findhalnya, tetapi BSD locatetidak melakukan regex sama sekali. Jika Anda seperti saya dan harus menggunakan berbagai jenis mesin, Anda lebih suka grepmemfilter daripada mengembangkan ketergantungan pada -ratau --regex.

    locatemembutuhkan penyaringan yang kuat lebih dari finditu karena ...

  • find(1)belum tentu mencari seluruh sistem file. Anda biasanya mengarahkannya ke subdirektori, induk yang berisi semua file yang Anda inginkan untuk beroperasi. Perilaku khas untuk locate(1)implementasi adalah memuntahkan semua file yang cocok dengan pola Anda, membiarkannya untuk grepmemfilter dan semacamnya untuk mengurangi erupsi ke ukuran.

    (Tip jahat: locate /mungkin akan memberi Anda daftar semua file di sistem!)

    Ada varian locate(1)sejenis slocate(1)yang membatasi keluaran berdasarkan izin pengguna, tetapi ini bukan versi default dari locatesistem operasi utama apa pun.

  • find(1)dapat melakukan hal-hal ke file yang ditemukannya, selain hanya menemukan mereka. Operator tersebut yang paling kuat dan didukung secara luas adalah -exec, tetapi ada yang lain. Dalam implementasi menemukan GNU dan BSD baru-baru ini, misalnya, Anda memiliki -deletedan -execdiroperator.

  • find(1) berjalan secara real time, sehingga outputnya selalu terkini.

    Karena locate(1)bergantung pada basis data yang diperbarui jam atau hari di masa lalu, hasilnya dapat kedaluwarsa. (Ini adalah masalah cache basi .) Koin ini memiliki dua sisi:

    1. locate dapat memberi nama file yang sudah tidak ada.

      GNU locatedan mlocatememiliki -ebendera untuk membuatnya memeriksa keberadaan file sebelum mencetak nama setiap file yang ditemukan di masa lalu, tetapi ini memakan beberapa locatekeunggulan kecepatan, dan locateselain itu tidak tersedia di BSD .

    2. locate akan gagal memberi nama file yang dibuat sejak pembaruan basis data terakhir.

    Anda belajar untuk agak tidak percaya pada locatehasil, mengetahui itu mungkin salah.

    Ada beberapa cara untuk mengatasi masalah ini, tetapi saya tidak mengetahui adanya implementasi yang digunakan secara luas. Sebagai contoh, ada rlocate, tetapi tampaknya tidak bekerja terhadap kernel Linux modern.

  • find(1) tidak pernah memiliki hak istimewa lebih dari pengguna yang menjalankannya.

    Karena locatemenyediakan layanan global untuk semua pengguna pada suatu sistem, ia ingin agar updatedbprosesnya berjalan rootsehingga dapat melihat keseluruhan sistem file. Ini mengarah ke pilihan masalah keamanan:

    1. Jalankan updatedbsebagai root, tetapi buat file outputnya dapat dibaca dunia sehingga locatedapat dijalankan tanpa hak istimewa. Ini secara efektif memaparkan nama semua file dalam sistem untuk semua pengguna. Ini mungkin merupakan pelanggaran keamanan yang cukup untuk menyebabkan masalah nyata.

      BSD locatedikonfigurasi dengan cara ini di Mac OS X dan FreeBSD.

    2. Tulis basis data sebagai hanya dapat dibaca oleh root, dan buat locate setuidroot sehingga dapat membaca database. Ini berarti locatesecara efektif harus menerapkan kembali sistem izin OS sehingga tidak menunjukkan file yang biasanya tidak Anda lihat. Ini juga meningkatkan permukaan serangan sistem Anda, khususnya berisiko serangan eskalasi root .

    3. Buat " locate" pengguna atau grup khusus untuk memiliki file database, dan tandai locatebiner setuid/setgiduntuk "" pengguna / grup itu sehingga dapat membaca database. Ini tidak mencegah serangan eskalasi hak istimewa dengan sendirinya, tetapi ini sangat mengurangi kerusakan yang bisa diakibatkannya.

      mlocatedikonfigurasi dengan cara ini di Red Hat Enterprise Linux .

      Anda masih memiliki masalah, karena, jika Anda dapat menggunakan debugger locateatau menyebabkannya membuang inti Anda bisa mendapatkan bagian istimewa dari database.

    Saya tidak melihat cara untuk membuat perintah yang benar-benar "aman" locate, singkat menjalankannya secara terpisah untuk setiap pengguna pada sistem, yang meniadakan sebagian besar kelebihannya find(1).

Intinya, keduanya sangat berguna. locate(1)lebih baik ketika Anda hanya mencoba menemukan file tertentu dengan nama, yang Anda tahu ada, tetapi Anda tidak ingat di mana tepatnya. find(1)lebih baik ketika Anda memiliki area fokus untuk diperiksa, atau ketika Anda membutuhkan salah satu dari banyak kelebihannya.

Warren Young
sumber
Maaf, saya mengabaikan paragraf "slocate". rlocate mengatasi masalah cache basi . Anda mungkin ingin menyebutkan beberapa keanehan dari menemukan, seperti find -- "$dir" tidak kuat ( $dirdapat diambil untuk predikat), tidak ada cara untuk menguji atribut dari symlink, masalah kondisi ras ... Bagi saya finddan locatemengatasi dua masalah yang berbeda. Ada banyak tempat di mana menggunakan find tidak realistis (seperti direktori yang berisi jutaan file). loc adalah sistem pengindeksan terbatas pada nama file.
Stéphane Chazelas
2
Implementasi locatepertama kira-kira seperti find / -type f | gzip > locate.gz, danzgrep "$1" <locate.gz
F. Hauri
@ F. Hauri: Hal-hal sepele yang menarik. Berikut ini lebih lanjut: GNU locateada dalam findutilspaket, dan updatedbprogramnya diimplementasikan dalam hal find(1). Jadi dalam pengertian itu, locate(1)sebenarnya membutuhkan find(1) . :)
Warren Young
1
@ WarrenYoung mengapa ada referensi konstan untuk foo (1) bukan hanya foo? apakah ada versi berbeda dari foo?
gila tentang natty
4
@nuttyaboutnatty: Ini adalah konvensi kuno di manual Unix, yang berarti bagian panduan 1. Meskipun benar bahwa tidak ada find, locate, dll di bagian lain sehingga tidak harus berada di sana untuk disambiguate nama yang sama digunakan dalam bagian yang berbeda dari manual (misalnya unlink(1)vs unlink(2)), kita yang terbiasa dengan konvensi melihat itu sebagai referensi halaman manual.
Warren Young
35

locatemenggunakan basis data prebuilt, yang harus diperbarui secara berkala, sementara finditerasi melalui sistem file untuk mencari file.

Dengan demikian, locatejauh lebih cepat daripada find, tetapi bisa tidak akurat jika database -dapat dilihat sebagai cache- tidak diperbarui (lihat updatedbperintah).

Selain itu, finddapat menawarkan lebih banyak rincian, karena Anda dapat memfilter file dengan setiap atributnya, sambil locatemenggunakan pola yang cocok dengan nama file.

pengguna435943
sumber
7

findtidak mungkin bagi pengguna pemula atau sesekali dari Unix untuk berhasil menggunakan tanpa teliti halaman manual. Secara historis, beberapa versi findbahkan tidak menetapkan -printopsi, menambah permusuhan pengguna.

locate kurang fleksibel, tetapi jauh lebih intuitif untuk digunakan dalam kasus umum.

Russell Borogove
sumber
1
Di sisi lain loc harus memelihara DB dan berjalan secara berkala, jadi saya telah menonaktifkannya di semua server Linux yang berada di jaringan pribadi kami.
Rui F Ribeiro
2
Apa yang sulit tentang itu? find . -name 'nametosearch', atau -inameuntuk case-insensitive. Ganti .dengan jalur direktori untuk mencari selain direktori saat ini. Di sana, itu adalah 90% dari kebutuhan pengguna pemula yang dicakup tanpa masuk ke globbing file. (Saya biasanya akan menggunakan find . -iname '*partialfilename*'dan jika saya mencari dari /, saya menggunakan find / -maxdepth 5 -iname '*partialname*'yang mengurangi waktu pencarian sambil menemukan semua yang saya minati 90% dari waktu. Di sana, 75% dari persyaratan pengguna menengah.) :)
Wildcard
2

Kelemahan kecil dari lokasinya adalah mungkin tidak mengindeks area sistem file yang Anda minati. Pada sistem desktop Debian, misalnya Linux Mint 17.2, file /etc/updatedb.conf dikonfigurasikan untuk mengecualikan area tertentu dari pertimbangan. , termasuk / tmp, / var / spool, dan /home/.ecryptfs.

Mengabaikan /home/.ecryptfs mencegah nama file di direktori terenkripsi dari terpapar ke pengguna yang tidak sah. Namun, jika direktori home Anda dienkripsi dengan ecryptfs, itu juga berarti direktori home Anda tidak diindeks, dan karenanya tidak akan menemukan apa pun di direktori home Anda. Ini mungkin membuatnya sangat tidak berguna bagi Anda (bagi saya). Selain tidak menemukan hasil, proses updatedb akan memuat disk Anda secara berkala tanpa manfaat, dan mungkin juga dinonaktifkan jika Anda adalah pengguna utama atau satu-satunya pengguna sistem.

Jim
sumber