Đăng Nhập

Vui lòng khai báo chính xác tên truy cập và mật khẩu!

Quên mật khẩu?

    Tìm kiếm trong môi trường dòng lệnh với lệnh locate

      Tony Stark

      Giới tính : Nam

      Tuổi : 31

      Đến từ : Cần thơ

      Ngày Tham gia : 10/01/2012

      Tổng số bài gửi : 750

      #1

       Thu Apr 05, 2012 2:52 pm

      Quản Trị Mạng - 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

      Giả sử bạn có hai file tên: new.txt và NEW.txt trong thư mục /home.
      Mặc định locate sẽ phân biệt chữ viết hoa và thường, vậy nên nếu bạn sử
      dụng:

      $ locate new.txt
      /home/new.txt

      Nếu muốn tìm tất cả các trường hợp cả chữ in hoa và thường bạn cần tham số -i

      $ locate -i new.txt
      /home/new.txt
      /home/NEW.txt

      Tiếp theo giả sử bạn xóa file new.txt và ngay lúc đó mlocate.db chưa được cập nhật, nếu bạn chạy lệnh $ locate new.txt thì kết quả vẫn sẽ trả về đường dẫn của file đó là /home/new.txt. Tuy nhiên file đó không còn tồn tại.

      Để tránh trường hợp trên bạn có thể sử dụng tham số -e để kiểm tra đường dẫn trả về có tồn tại. Như trong trường hợp này nó sẽ không trả về /home/new.txt

      $ locate -i -e new.txt
      /home/NEW.txt

      Nếu kết quả trả về quá dài như:

      $ locate passwd

      /etc/passwd
      /etc/passwd-
      /etc/dovecot/conf.d/auth-passwdfile.conf.ext
      /etc/pam.d/passwd
      /etc/security/opasswd
      /etc/vsftpd/passwd
      /lib64/security/pam_unix_passwd.so
      /usr/bin/gpasswd
      /usr/bin/htpasswd
      ...

      Bạn chỉ muốn xem ba kết quả đầu tiên? Thêm tham số -l 3

      $ locate passwd

      /etc/passwd
      /etc/passwd-
      /etc/dovecot/conf.d/auth-passwdfile.conf.ext

      Trên đây là một số thông tin cơ bản về câu lệnh locate. Bạn có thể tìm hiểu thêm những tham số của nó trong tài liệu hướng dẫn ($ man locate) Hy vọng bài viết giúp ích được các bạn!