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)
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.)
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:
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 .
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:
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.
Tulis basis data sebagai hanya dapat dibaca oleh root, dan buat locatesetuidroot 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 .
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.
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.
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 membutuhkanfind(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.
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.
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.
Jawaban:
locate(1)
hanya memiliki satu keunggulan besarfind(1)
: kecepatan.find(1)
Namun, memiliki banyak keunggulan dibandingkanlocate(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 darifind(1)
. Nenek moyang paling awallocate(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 BSD
locate(1)
, tapi itu hanya karena dua rasa utama lainnya darilocate
menerapkan semua pilihan nya:-0
,-c
,-d
,-i
,-l
,-m
,-s
, dan-S
.mlocate
mengimplementasikan 6 pilihan tambahan yang tidak di BSDlocate
:-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 mengirimmlocate
sebagai gantinya. Debian tidak menginstal baik di instalasi dasarnya, tetapi menawarkan kedua versi dalam repositori paket default; jika keduanya diinstal sekaligus, "locate
" berjalanmlocate
.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 menggunakanmlocate
.)IBM AIX masih tidak mengirimkan versi apa pun
locate
, setidaknya pada AIX 7.2 , kecuali Anda menginstal GNUfindutils
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 sepertifind
halnya, tetapi BSDlocate
tidak melakukan regex sama sekali. Jika Anda seperti saya dan harus menggunakan berbagai jenis mesin, Anda lebih sukagrep
memfilter daripada mengembangkan ketergantungan pada-r
atau--regex
.locate
membutuhkan penyaringan yang kuat lebih darifind
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 untuklocate(1)
implementasi adalah memuntahkan semua file yang cocok dengan pola Anda, membiarkannya untukgrep
memfilter dan semacamnya untuk mengurangi erupsi ke ukuran.(Tip jahat:
locate /
mungkin akan memberi Anda daftar semua file di sistem!)Ada varian
locate(1)
sejenisslocate(1)
yang membatasi keluaran berdasarkan izin pengguna, tetapi ini bukan versi default darilocate
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
danmlocate
memiliki-e
bendera untuk membuatnya memeriksa keberadaan file sebelum mencetak nama setiap file yang ditemukan di masa lalu, tetapi ini memakan beberapalocate
keunggulan kecepatan, danlocate
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 agarupdatedb
prosesnya berjalanroot
sehingga dapat melihat keseluruhan sistem file. Ini mengarah ke pilihan masalah keamanan:Jalankan
updatedb
sebagai root, tetapi buat file outputnya dapat dibaca dunia sehinggalocate
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 buatlocate
setuid
root sehingga dapat membaca database. Ini berartilocate
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 tandailocate
binersetuid/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 kelebihannyafind(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.sumber
find -- "$dir"
tidak kuat ($dir
dapat diambil untuk predikat), tidak ada cara untuk menguji atribut dari symlink, masalah kondisi ras ... Bagi sayafind
danlocate
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 sepertifind / -type f | gzip > locate.gz
, danzgrep "$1" <locate.gz
locate
ada dalamfindutils
paket, danupdatedb
programnya diimplementasikan dalam halfind(1)
. Jadi dalam pengertian itu,locate(1)
sebenarnya membutuhkanfind(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 (misalnyaunlink(1)
vsunlink(2)
), kita yang terbiasa dengan konvensi melihat itu sebagai referensi halaman manual.locate
menggunakan basis data prebuilt, yang harus diperbarui secara berkala, sementarafind
iterasi melalui sistem file untuk mencari file.Dengan demikian,
locate
jauh lebih cepat daripadafind
, tetapi bisa tidak akurat jika database -dapat dilihat sebagai cache- tidak diperbarui (lihatupdatedb
perintah).Selain itu,
find
dapat menawarkan lebih banyak rincian, karena Anda dapat memfilter file dengan setiap atributnya, sambillocate
menggunakan pola yang cocok dengan nama file.sumber
find
tidak mungkin bagi pengguna pemula atau sesekali dari Unix untuk berhasil menggunakan tanpa teliti halaman manual. Secara historis, beberapa versifind
bahkan tidak menetapkan-print
opsi, menambah permusuhan pengguna.locate
kurang fleksibel, tetapi jauh lebih intuitif untuk digunakan dalam kasus umum.sumber
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 menggunakanfind . -iname '*partialfilename*'
dan jika saya mencari dari/
, saya menggunakanfind / -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.
sumber