Lệnh which, whereis, locate trên Linux: 3 lệnh tìm vị trí (đường dẫn) của tệp

Có lúc bạn cần sửa httpd.conf nhưng không biết tệp nằm ở đâu, hoặc một lệnh cùng tên có ở hai nơi nên không rõ bản nào sẽ được chạy. Lệnh which trên Linux tìm tệp thực sự được chạy, lệnh whereis trên Linux tìm tệp thực thi cùng thư mục cấu hình · trang man, còn lệnh locate tìm mọi đường dẫn có chứa tên đó. Bài viết so sánh khác biệt giữa ba lệnh bằng bảng và cho bạn tự gõ thử trên server ảo ngay trong trình duyệt.
Trên AlmaLinux 9.8, which nằm trong gói which 2.21 và whereis nằm trong gói util-linux 2.37.4 nên dùng được ngay từ đầu, còn locate thì phải cài riêng gói mlocate 0.26.
✅ Khác biệt giữa which · whereis · locate
Ba lệnh này tìm ở những nơi khác nhau. which và whereis lục ngay tại chỗ trong các thư mục định sẵn, còn locate tìm tên trong danh sách tệp (DB) được tạo sẵn từ trước.
| Lệnh | Đối tượng tìm | Nơi tìm | Tệp mới tạo |
|---|---|---|---|
| which | Một tệp lệnh được chạy, bí danh (alias) | Các thư mục có trong PATH | Tìm thấy ngay |
| whereis | Tệp thực thi · thư mục cấu hình · trang man | Các thư mục định sẵn như /usr/bin · /etc · /usr/share/man | Tìm thấy ngay |
| locate | Mọi tệp và thư mục có chứa tên đó | DB tạo sẵn (/var/lib/mlocate/mlocate.db) | Tìm thấy sau updatedb |
Tìm cùng httpd bằng which và whereis là thấy ngay sự khác biệt.
~]# which httpd
/usr/sbin/httpd
~]# whereis httpd
httpd: /usr/sbin/httpd /usr/lib64/httpd /etc/httpd /usr/share/httpd /usr/share/man/man8/httpd.8.gzlocate hiển thị mọi đường dẫn chỉ cần khớp một phần tên, nên khi gõ [locate httpd.conf], kết quả không chỉ có tệp cấu hình mà còn có cả trang man (httpd.conf.5.gz) lẫn các bản sao lưu đã tạo.
Trên server ảo bên dưới, chọn which · whereis · locate ở bên trái thì các chip sẽ thay đổi, và bấm vào chip là lệnh đó được nhập vào. Bạn cũng có thể gõ trực tiếp bằng bàn phím.
Để tìm tệp theo kích thước hoặc ngày sửa đổi thay vì theo tên, hãy dùng lệnh find, còn đường dẫn của thư mục hiện tại thì kiểm tra bằng lệnh pwd.
✅ Lệnh which trên Linux
which lục lần lượt các thư mục trong PATH từ đầu và hiển thị tệp thực thi đầu tiên tìm thấy. Đây chính là tệp thực sự được chạy khi bạn gõ lệnh.
Trên AlmaLinux, bash chuyển danh sách bí danh cho which, nên với lệnh có bí danh, kết quả hiện cả bí danh lẫn tệp thật. Nếu không có ở đâu trong PATH, kết quả sẽ là [no tên_lệnh in (PATH)].
~]# which ll
alias ll='ls -l --color=auto'
/usr/bin/ls
~]# which htop
/usr/bin/which: no htop in (/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin)Trên thực tế chỉ có một tùy chọn là -a. Khi cùng một tên có ở hai thư mục trong PATH, tùy chọn này hiển thị cả hai, và tệp hiện ở trên cùng là tệp thực sự được chạy.
~]# which ping
/usr/sbin/ping
~]# which -a ping
/usr/sbin/ping
/usr/bin/pingTrên AlmaLinux 9.8, /usr/sbin/ping là liên kết trỏ tới /usr/bin/ping nên kết quả như nhau. Chương trình bạn tự cài nếu nằm trong /usr/local/bin sẽ được chạy trước chương trình trong /usr/bin theo thứ tự của PATH.
[which cd] hiển thị /usr/bin/cd, nhưng khi gõ cd trong shell thì thứ được chạy là lệnh tích hợp sẵn của shell chứ không phải tệp này. Kiểm tra xem một lệnh có phải lệnh tích hợp hay không bằng [type cd], kết quả sẽ là [cd is a shell builtin].
✅ Lệnh whereis trên Linux
whereis dùng tên lệnh để tìm cùng lúc tệp thực thi và trang man. Lệnh này lục các thư mục định sẵn như /usr/bin · /usr/sbin · /usr/lib64 · /etc · /usr/share mà không phụ thuộc vào PATH, nên cả thư mục cấu hình trùng tên (/etc/httpd) cũng hiện ra.
| Tùy chọn | Mô tả | |
|---|---|---|
| -b | Chỉ phần tệp thực thi. Với httpd là /usr/sbin/httpd và /usr/lib64/httpd · /etc/httpd · /usr/share/httpd | |
| -m | Chỉ trang man (/usr/share/man · /usr/share/info) | |
| -s | Chỉ mã nguồn. Trên bản cài mặc định của AlmaLinux 9.8, chỉ hiện tên như [httpd:] | |
| -l | Danh sách thư mục mà whereis tìm |
~]# whereis -b httpd
httpd: /usr/sbin/httpd /usr/lib64/httpd /etc/httpd /usr/share/httpd
~]# whereis -m httpd
httpd: /usr/share/man/man8/httpd.8.gz
~]# whereis passwd
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1ossl.gz /usr/share/man/man1/passwd.1.gzNếu không tìm thấy gì, chỉ hiện tên như [htop:]. which trả về mã thoát 1 khi không tìm thấy, còn whereis trả về 0, nên khi kiểm tra trong script xem đã cài đặt hay chưa, hãy dùng which.
✅ Lệnh locate trên Linux
locate không lục ổ đĩa mà tìm tên trong DB đã tạo sẵn. Vì vậy lệnh chạy nhanh, nhưng không tìm được các tệp tạo ra sau khi DB được tạo.
~]# dnf -y install mlocate
~]# updatedbNếu gõ ngay sau khi cài, vì chưa có DB nên sẽ hiện [locate: can not stat () `/var/lib/mlocate/mlocate.db’: No such file or directory]; chạy updatedb một lần là DB được tạo. Sau đó, mlocate-updatedb.timer sẽ tạo lại DB mỗi ngày một lần.
Tệp mới tạo sẽ không hiện ra trước khi chạy updatedb, còn tệp đã xóa vẫn tiếp tục hiện ra cho đến khi chạy updatedb. Để chỉ xem những tệp hiện đang tồn tại, hãy thêm -e.
~]# touch report.txt
~]# locate report.txt
~]# updatedb
~]# locate report.txt
/root/work/report.txt
~]# rm -f report.txt
~]# locate report.txt
/root/work/report.txt
~]# locate -e report.txtPRUNEPATHS trong /etc/updatedb.conf có chứa /tmp · /var/tmp · /mnt · /media, nên tệp trong các thư mục này không hiện ra dù đã chạy updatedb.
🔲 Tùy chọn lệnh locate
| Tùy chọn | Mô tả | |
|---|---|---|
| -i | Tìm không phân biệt chữ hoa · chữ thường | |
| -c | Chỉ hiện số kết quả tìm được thay vì đường dẫn | |
| -l= -n | Thêm số phía sau để chỉ hiện tối đa bấy nhiêu kết quả. -l 3 | |
| -b | Chỉ tìm trong tên tệp ở cuối đường dẫn | |
| -e | Bỏ qua những tệp có trong DB nhưng hiện không còn tồn tại | |
| -S | Thông tin DB (số thư mục · số tệp · kích thước) | |
| -r | Tìm bằng biểu thức chính quy. locate -r “httpd.conf$” |
ℹ️ Thông báo tiếp thị liên kết
Nội dung trên trang này có chứa liên kết affiliate (tiếp thị liên kết). Khi khách truy cập mua sản phẩm hoặc dịch vụ qua các liên kết này, trang sẽ nhận hoa hồng từ bên bán. Trong quá trình đó, số tiền người mua phải trả (sẽ giảm khi có chương trình khuyến mãi ↓) không hề tăng lên. Giá, khuyến mãi và tình trạng hàng được đăng theo thời điểm viết bài và có thể khác với thực tế, vì vậy hãy kiểm tra lại lần cuối với bên bán trước khi mua. Việc chọn và đánh giá sản phẩm dựa trên tiêu chí riêng của trang; việc có nhận hoa hồng hay không không ảnh hưởng đến thứ tự giới thiệu hay nội dung đánh giá.