
Tìm kiếm trong môi trường dòng lệnh
với lệnh locate
Trong môi trường dòng lệnh, khi bạn muốn tìm một file nào đó, thông
thường bạn sẽ dùng câu lệnh find nhưng nhược điểm của find là tốc độ chậm.
locate là một trong những giải pháp thay thế hiệu quả trong nhiều trường hợp.
Linh hoạt, thực thi nhanh, tuy nhiên đánh đổi lại nó cũng có những hạn chế. Bài
viết này xin giới thiệu khái quát một số điều cơ bản về câu lệnh 'locate' và một số
ví dụ thực hành.
Cơ chế hoạt động của locate

Như đã nói ở trên, ưu điểm của locate là tốc độ, lý do nào khiến nó hoạt động
nhanh như vậy?
Thực ra locate không tìm thông tin về file trên đĩa cứng như find, nó chỉ tìm kiếm
đường dẫn trong một cơ sở dữ liệu tên là mlocate.db. CSDL này lưu thông tin về
các file và đường dẫn trong hệ thống lưu trữ. Bạn có thể tìm thấy nó tại:
/var/lib/mlocate/mlocate.db
Câu hỏi tiếp theo là: nếu locate chỉ đơn thuần tìm kiếm đường dẫn trong
mlocate.db thì cơ chế nào giúp cập nhật cho mlocate.db?
mlocate.db được cập nhật bởi một tiện ích tên updatedb. Khi ta khởi chạy
updatedb nó sẽ quét toàn bộ hệ thống và cập nhật thông tin về đường dẫn vào
mlocate.db.
Để update thông tin cho mlocate.db thủ công:
$ sudo updatedb
Từ đây bạn có thể thấy rõ nhược điểm của locate, kết quả của nó trả về phụ thuộc
vào tính chính xác của mlocate.db và điều này lại phụ thuộc vào updatedb. Vậy để
tăng tính chính xác của locate chúng ta cần thay đổi thời gian mỗi lần cập nhật
mlocate.db.
Ngoài ra các thông số về định dạng file, nơi cần đánh chỉ mục với câu lệnh
locatedb được lưu trong /etc/updatedb.conf. Bạn có thể thay đổi thông số của file
này để phù hợp với nhu cầu của mình:
$ sudo nano /etc/updatedb.conf
PRUNE_BIND_MOUNTS="yes"
PRUNENAMES=".git .bzr .hg .svn"
PRUNEPATHS="/tmp /var/spool /media"
PRUNEFS="NFS nfs nfs4 rpc_pipefs afs binfmt_misc proc smbfs autofs iso9660
ncpfs coda devpts ftpfs devfs mfs shfs sysfs cifs lustre_lite tmpfs usbfs udf
fuse.glusterfs fuse.sshfs ecryptfs fusesmb devtmpfs"

updatedb.conf lưu các thông tin dưới dạng Biến = Giá trị. Trong đó:
PRUNEFS thông tin về các kiểu file hệ thống mà sẽ không được quét và
cập nhật bởi câu lệnh updatedb.
PRUNENAMES thông tin về các định dạng file mà không được quét và
cập nhật.
PRUNEPATHS thông tin về những thư mục sẽ không được quét và cập
nhật
PRUNE_BIND_MOUNTS nhận giá trị 0 hoặc 1 ('no' hoặc 'yes') nếu là
'yes' (1) thì locatedb sẽ không quét các phân vùng được mount với tham số –bind.
Bạn có thể thay đổi các thông số này sao cho phù hợp với nhu cầu.
Một số ví dụ
Cách thức sử dụng locate như sau:
$ locate -tham_số tên_file
Tìm file tên httpd.conf
$ locate httpd.conf
/etc/httpd/conf/httpd.conf
/usr/local/apache2/conf/httpd.conf
Dùng tham số -0 để hiển thị kết quả trên một dòng:
$ locate httpd.conf /etc/httpd/conf/httpd.conf
/usr/local/apache2/conf/httpd.conf
Hiển thị số đếm kết quả
Dùng tham số -c để đếm số kết quả trả về:
$ locate -c httpd.conf

