Jawaban:
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 locate
menerapkan semua pilihan nya: -0
, -c
, -d
, -i
, -l
, -m
, -s
, dan -S
. mlocate
mengimplementasikan 6 pilihan tambahan yang tidak di BSD locate
: -b
, -e
, -P
, -q
, --regex
dan -w
. GNUlocate
mengimplementasikan enam ditambah lagi empat : -A
, -D
, -E
, dan -p
. (Saya mengabaikan alias dan perbedaan kecil seperti -?
vs -h
vs. --help
)
BSD dan Mac OS X mengirimkan BSD locate
.
Sebagian besar Linux mengirimkan GNU locate
, tetapi Red Hat Linuxes dan Arch mengirim mlocate
sebagai 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 mlocate
di Solaris sejak 11.2 , dirilis pada Desember 2014. Sebelumnya, locate
Solaris 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 findutils
dari AIX Toolbox untuk Aplikasi Linux .
HP-UX juga tampaknya kurang locate
dalam 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:
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 find
halnya, tetapi BSD locate
tidak melakukan regex sama sekali. Jika Anda seperti saya dan harus menggunakan berbagai jenis mesin, Anda lebih suka grep
memfilter daripada mengembangkan ketergantungan pada -r
atau --regex
.
locate
membutuhkan penyaringan yang kuat lebih dari find
itu 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 grep
memfilter 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 locate
sistem 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 -delete
dan -execdir
operator.
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:
locate
dapat memberi nama file yang sudah tidak ada.
GNU locate
dan mlocate
memiliki -e
bendera untuk membuatnya memeriksa keberadaan file sebelum mencetak nama setiap file yang ditemukan di masa lalu, tetapi ini memakan beberapa locate
keunggulan kecepatan, dan locate
selain itu tidak tersedia di BSD .
locate
akan gagal memberi nama file yang dibuat sejak pembaruan basis data terakhir.
Anda belajar untuk agak tidak percaya pada locate
hasil, 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 locate
menyediakan layanan global untuk semua pengguna pada suatu sistem, ia ingin agar updatedb
prosesnya berjalan root
sehingga dapat melihat keseluruhan sistem file. Ini mengarah ke pilihan masalah keamanan:
Jalankan updatedb
sebagai root, tetapi buat file outputnya dapat dibaca dunia sehingga locate
dapat 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 locate
dikonfigurasi dengan cara ini di Mac OS X dan FreeBSD.
Tulis basis data sebagai hanya dapat dibaca oleh root
, dan buat locate
setuid
root sehingga dapat membaca database. Ini berarti locate
secara 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 .
Buat " locate
" pengguna atau grup khusus untuk memiliki file database, dan tandai locate
biner setuid/setgid
untuk "" pengguna / grup itu sehingga dapat membaca database. Ini tidak mencegah serangan eskalasi hak istimewa dengan sendirinya, tetapi ini sangat mengurangi kerusakan yang bisa diakibatkannya.
mlocate
dikonfigurasi dengan cara ini di Red Hat Enterprise Linux .
Anda masih memiliki masalah, karena, jika Anda dapat menggunakan debugger locate
atau 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.
find -- "$dir"
tidak kuat ( $dir
dapat diambil untuk predikat), tidak ada cara untuk menguji atribut dari symlink, masalah kondisi ras ... Bagi saya find
dan locate
mengatasi 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.
locate
pertama kira-kira seperti find / -type f | gzip > locate.gz
, danzgrep "$1" <locate.gz
locate
ada dalam findutils
paket, dan updatedb
programnya diimplementasikan dalam hal find(1)
. Jadi dalam pengertian itu, locate(1)
sebenarnya membutuhkan find(1)
. :)
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.
locate
menggunakan basis data prebuilt, yang harus diperbarui secara berkala, sementara find
iterasi melalui sistem file untuk mencari file.
Dengan demikian, locate
jauh lebih cepat daripada find
, tetapi bisa tidak akurat jika database -dapat dilihat sebagai cache- tidak diperbarui (lihat updatedb
perintah).
Selain itu, find
dapat menawarkan lebih banyak rincian, karena Anda dapat memfilter file dengan setiap atributnya, sambil locate
menggunakan pola yang cocok dengan nama file.
find
tidak mungkin bagi pengguna pemula atau sesekali dari Unix untuk berhasil menggunakan tanpa teliti halaman manual. Secara historis, beberapa versi find
bahkan tidak menetapkan -print
opsi, menambah permusuhan pengguna.
locate
kurang fleksibel, tetapi jauh lebih intuitif untuk digunakan dalam kasus umum.
find . -name 'nametosearch'
, atau -iname
untuk 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.) :)
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.