Hệ điều hành Linux cung cấp nhiều phương pháp để bạn tìm kiếm các tệp và thư mục, bao gồm các lệnh mạnh mẽ như locate, find và whereis. Việc nắm vững thời điểm và cách sử dụng từng lệnh sẽ giúp bạn tiết kiệm đáng kể thời gian và công sức trong công việc quản lý hệ thống. Bài viết này sẽ đi sâu phân tích từng công cụ, giúp bạn hiểu rõ ưu nhược điểm và lựa chọn lệnh phù hợp nhất cho từng tình huống cụ thể, từ đó tối ưu hóa quá trình làm việc với các tệp trên Linux.
Lệnh locate: Tìm kiếm tức thì với cơ sở dữ liệu
Lệnh locate được thiết kế để tìm kiếm các tệp và thư mục dựa trên tên của chúng, hoặc một phần của tên, với tốc độ gần như tức thời. Sở dĩ locate có thể nhanh đến vậy là vì nó không thực sự quét hệ thống tệp của bạn theo thời gian thực. Thay vào đó, nó truy vấn một cơ sở dữ liệu được xây dựng sẵn, thường được đặt tên là mlocate.db, plocate.db, hoặc đơn giản là locate.db, tùy thuộc vào bản phân phối Linux bạn đang sử dụng.
Cơ sở dữ liệu này không được cập nhật theo thời gian thực. Điều này có nghĩa là nếu bạn vừa tạo hoặc xóa một tệp, lệnh locate có thể sẽ không biết về sự thay đổi đó cho đến khi cơ sở dữ liệu được cập nhật lần tiếp theo. Việc cập nhật cơ sở dữ liệu thường xuyên được thực hiện bởi một quy trình hệ thống, điển hình là thông qua một cron job chạy hàng ngày. Bạn cũng có thể chủ động cập nhật cơ sở dữ liệu bằng lệnh “sudo updatedb”, mặc dù việc lập chỉ mục toàn bộ hệ thống tệp có thể mất một khoảng thời gian nhất định.
Cú pháp cơ bản của lệnh locate rất đơn giản và dễ nhớ:
locate -i ten_file
Nếu tệp tồn tại và cơ sở dữ liệu được cập nhật, locate sẽ liệt kê tất cả các đường dẫn chứa “my_script.sh”. Tùy chọn -i giúp tìm kiếm không phân biệt chữ hoa, chữ thường.
Sử dụng lệnh locate để tìm kiếm tệp theo tên trong terminal Ubuntu
Bạn cũng có thể tìm kiếm tất cả các tệp với một phần mở rộng cụ thể, đếm số lượng kết quả khớp bằng tùy chọn -c, hoặc giới hạn số lượng đầu ra bằng tùy chọn -n. Lệnh locate hỗ trợ khớp mẫu bằng ký tự đại diện (wildcard) và thậm chí cả biểu thức chính quy cơ bản, mang lại sự kiểm soát lớn hơn cho các tìm kiếm của bạn.
locate vs. mlocate vs. plocate: Những cải tiến quan trọng
Theo thời gian, tiện ích locate gốc đã được thay thế trong hầu hết các bản phân phối bởi mlocate, phiên bản này đã giới thiệu những cải tiến quan trọng – chẳng hạn như tôn trọng quyền của người dùng, nghĩa là bạn chỉ thấy các tệp mà bạn được phép truy cập.
Khi mlocate được cài đặt, nó sẽ cung cấp chính lệnh locate. Vì vậy, ngay cả khi bạn gõ locate, bạn thực sự đang chạy mlocate ở chế độ nền. Bạn có thể xác nhận điều này bằng cách kiểm tra phiên bản:
locate --version
Lệnh này sẽ hiển thị phiên bản locate đang xử lý các tìm kiếm của bạn.
Gần đây hơn, một triển khai mới có tên plocate đã bắt đầu thay thế mlocate trong một số bản phân phối. plocate nhanh hơn và hiệu quả hơn, sử dụng một chỉ mục được nén để giảm thời gian tìm kiếm và dung lượng đĩa – đặc biệt hữu ích trên các hệ thống có số lượng tệp lớn. Fedora, chẳng hạn, hiện sử dụng plocate theo mặc định, và nhiều bản phân phối khác đang bắt đầu làm theo.
Bạn cũng có thể cài đặt plocate bằng trình quản lý gói mặc định của mình, ví dụ trên Ubuntu, chạy:
sudo apt install plocate
Cài đặt công cụ dòng lệnh plocate trên Ubuntu bằng APT manager
Một lần nữa, ngay cả khi plocate được cài đặt, lệnh bạn gõ vẫn là locate, vì vậy không có gì thay đổi trong cách bạn sử dụng nó. Đối với hầu hết người dùng, chức năng và cú pháp là như nhau. Tuy nhiên, một vài tùy chọn nâng cao có thể khác một chút giữa mlocate và plocate.
Lệnh find: Tìm kiếm chi tiết và mạnh mẽ theo thời gian thực
Khác với lệnh locate, lệnh find tìm kiếm các tệp và thư mục theo thời gian thực bằng cách duyệt trực tiếp hệ thống phân cấp thư mục mà bạn chỉ định. Nó không dựa vào cơ sở dữ liệu, điều này có nghĩa là nó luôn trả về thông tin cập nhật nhất. Tuy nhiên, điều này cũng đồng nghĩa với việc nó có thể chậm hơn locate, đặc biệt khi tìm kiếm trên các hệ thống tệp lớn.
Giao diện desktop Ubuntu minh họa môi trường làm việc Linux
Điều làm cho find trở nên nổi bật là khả năng tìm kiếm dựa trên một loạt các tiêu chí rộng lớn – không chỉ tên, mà còn loại, kích thước, quyền, quyền sở hữu, thời gian sửa đổi và nhiều hơn nữa. Chưa kể, find còn có thể thực thi các lệnh tùy ý (như rm, cp, hoặc chmod) trên các tệp mà nó tìm thấy bằng cách sử dụng tùy chọn -exec.
Dưới đây là cú pháp cơ bản của lệnh find:
find [đường_dẫn] [tùy_chọn] [biểu_thức]
- đường_dẫn: Nơi bắt đầu tìm kiếm (sử dụng
.cho thư mục hiện tại). - tùy_chọn & biểu_thức: Tìm kiếm gì và cách lọc kết quả.
Ví dụ, để tìm một tệp có tên config.xml trong thư mục chính của bạn và các thư mục con của nó, hãy chạy:
find /home/ten_nguoi_dung -name "config.xml"
Tương tự như locate, find có thể thực hiện tìm kiếm không phân biệt chữ hoa, chữ thường bằng cách sử dụng tùy chọn -iname (insensitive name):
find /var/log -iname "error*.log"
Lệnh này sẽ tìm các tệp như error.log, Error.Log, và ERROR-messages.log trong /var/log.
Bạn cũng có thể tìm kiếm các loại tệp cụ thể. Ví dụ, để tìm tất cả các thư mục (d) trong đường dẫn hiện tại, sử dụng:
find . -type d
Hoặc bạn có thể tìm các tệp lớn hơn một kích thước nhất định, chẳng hạn 100 MB (+100M) trong thư mục /opt của bạn với:
find /opt -size +100M
Tìm kiếm tệp theo kích thước cụ thể bằng lệnh find trong Linux
Hơn nữa, bạn có thể tìm kiếm các tệp trống, thư mục trống, hoặc các mục dựa trên thời gian sửa đổi cụ thể của chúng. Bạn cũng có thể chạy các lệnh khác trên mỗi tệp tìm thấy bằng find, ví dụ, xóa tất cả các tệp .tmp với lệnh sau:
find . -name "*.tmp" -exec rm {} ;
Lệnh whereis: Định vị nhị phân, mã nguồn và trang hướng dẫn
Lệnh whereis khá khác biệt so với locate và find. Trong khi hai lệnh đầu tiên là công cụ tìm kiếm tệp đa năng, whereis có một nhiệm vụ rất cụ thể: định vị tệp nhị phân (các tệp thực thi), tệp nguồn và các trang hướng dẫn sử dụng (manual pages) cho một lệnh nhất định.
Nó đặc biệt hữu ích khi bạn đang cố gắng hiểu cách một lệnh được cài đặt trên hệ thống của mình hoặc khi bạn đang khắc phục sự cố liên quan đến việc thực thi chương trình.
Minh họa các tệp và thư mục trên Linux, Windows và đám mây
Không giống như locate và find, whereis chỉ tìm kiếm trong một tập hợp các thư mục được xác định trước nơi các loại tệp này thường được lưu trữ – những nơi như /bin, /usr/bin và /usr/local/bin cho tệp nhị phân; /usr/share/man cho các trang hướng dẫn; và các thư mục mã nguồn khác nhau.
Ví dụ, nếu bạn muốn tìm tệp nhị phân ls, mã nguồn của nó (nếu có), và các trang man của nó, bạn có thể chạy:
whereis ls
Lệnh này sẽ cho bạn biết tệp nhị phân ls nằm ở “/bin/ls” và trang man của nó nằm ở “/usr/share/man/man1/ls.1.gz”.
Nếu bạn chỉ quan tâm đến đường dẫn thực thi, hãy sử dụng tùy chọn -b (binary):
whereis -b ls
Để chỉ tìm các trang hướng dẫn sử dụng, hãy sử dụng tùy chọn -m (man):
whereis -m bash
Bạn cũng có thể hỏi whereis về nhiều lệnh cùng lúc:
whereis grep sed awk
Tìm kiếm đường dẫn thực thi của nhiều lệnh bằng tiện ích whereis
Thông thường, các tệp nguồn không được cài đặt theo mặc định. Trong những trường hợp như vậy, đầu ra có thể chỉ bao gồm tên lệnh nếu không tìm thấy nguồn nào ở các vị trí tiêu chuẩn.
Khi nào nên sử dụng từng lệnh?
Bạn nên sử dụng lệnh locate khi bạn muốn có một cái nhìn tổng quan nhanh chóng, trên toàn hệ thống về vị trí của các tệp cụ thể với một tên nhất định. Nó hoạt động tốt nhất khi bạn khá chắc chắn rằng tệp không phải là mới tạo, hoặc bạn đã cập nhật cơ sở dữ liệu gần đây. locate là lựa chọn tuyệt vời cho các tìm kiếm thông thường và không yêu cầu độ chính xác tức thì.
Mặt khác, lệnh find phù hợp hơn khi bạn cần tìm kiếm dựa trên các tiêu chí khác ngoài tên, chẳng hạn như kích thước tệp, loại, quyền hạn hoặc ngày sửa đổi. Nó đặc biệt hữu ích khi bạn muốn tìm kiếm sâu trong một cây thư mục cụ thể, hoặc khi tệp bạn đang tìm có thể là mới và chưa được đưa vào cơ sở dữ liệu của locate. find cũng phát huy tác dụng khi bạn cần kết quả theo thời gian thực hoặc muốn thực hiện các hành động như xóa, sao chép hoặc thay đổi quyền trên các tệp mà nó tìm thấy.
Lệnh whereis rất hữu ích khi bạn cần định vị tệp nhị phân thực thi, tệp nguồn hoặc các trang hướng dẫn sử dụng (man pages) của một lệnh. Nó đặc biệt hữu ích khi bạn đang khắc phục sự cố với biến môi trường PATH của hệ thống hoặc cố gắng hiểu một chương trình được cài đặt ở đâu và như thế nào.
Đôi khi, nhu cầu của bạn có thể giao thoa giữa cả ba lệnh. Ví dụ, nếu locate trả về quá nhiều kết quả, bạn có thể sử dụng đầu ra của nó để thu hẹp đường dẫn bắt đầu cho một tìm kiếm find chính xác hơn. Những lệnh này không loại trừ lẫn nhau – chúng hoạt động hiệu quả nhất khi được sử dụng cùng nhau như một phần của bộ công cụ Linux của bạn. Hãy chia sẻ ý kiến hoặc kinh nghiệm sử dụng các lệnh này của bạn trong phần bình luận dưới đây!