Linux which、whereis、locate:查看位置(路徑)的 3 種指令

有時會遇到想修改 httpd.conf,卻不知道檔案在哪裡;或是同名的指令存在於兩個地方,搞不清楚實際執行的是哪一個。Linux which 指令會找出實際執行的檔案,Linux whereis 指令會找出執行檔與設定資料夾、說明手冊,locate 指令則會找出所有包含該名稱的路徑。本文用表格比較三個指令的差異,並讓你在瀏覽器中的虛擬伺服器上親手輸入試試。
在 AlmaLinux 9.8 中,which 包含在 which 2.21 套件、whereis 包含在 util-linux 2.37.4 套件中,一開始就能使用;locate 則需要另外安裝 mlocate 0.26 套件。
✅ which · whereis · locate 的差異
三個指令搜尋的地方不同。which 與 whereis 會當場搜尋固定的資料夾,locate 則是從事先建立好的檔案清單(DB)中尋找名稱。
| 指令 | 尋找對象 | 搜尋位置 | 新建立的檔案 |
|---|---|---|---|
| which | 實際執行的那一個指令檔、別名(alias) | PATH 中列出的資料夾 | 馬上找得到 |
| whereis | 執行檔 · 設定資料夾 · 說明手冊 | /usr/bin · /etc · /usr/share/man 等固定資料夾 | 馬上找得到 |
| locate | 包含該名稱的所有檔案與資料夾 | 事先建立的 DB(/var/lib/mlocate/mlocate.db) | updatedb 之後才找得到 |
用 which 與 whereis 搜尋同一個 httpd,馬上就能看出差異。
~]# 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 只要名稱有一部分相符,就會列出所有路徑,所以輸入 [locate httpd.conf],除了設定檔之外,連說明手冊(httpd.conf.5.gz)和備份的副本也會出現。
在下方的虛擬伺服器中,選擇左側的 which · whereis · locate,標籤就會跟著改變,點選標籤就會輸入該指令。也可以直接用鍵盤輸入。
要依大小或修改日期、而不是依名稱尋找檔案時,請使用 find 指令;目前所在資料夾的路徑,則用 pwd 指令確認。
✅ Linux which 指令
which 會從 PATH 中列出的資料夾由前往後依序搜尋,並顯示第一個找到的執行檔。輸入指令時實際執行的,就是這個檔案。
AlmaLinux 的 bash 會把別名清單傳給 which,所以設有別名的指令,會同時顯示別名與實際的檔案。如果 PATH 中哪裡都找不到,會出現 [no 指令 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)選項實際上只有 -a 一個。同一個名稱存在於 PATH 中的兩個資料夾時,會全部顯示,最上面的那一個才是實際執行的。
~]# which ping
/usr/sbin/ping
~]# which -a ping
/usr/sbin/ping
/usr/bin/pingAlmaLinux 9.8 的 /usr/sbin/ping 是指向 /usr/bin/ping 的連結,所以結果相同。自行安裝的程式如果放在 /usr/local/bin,依 PATH 的順序,會比 /usr/bin 中的程式先執行。
[which cd] 會顯示 /usr/bin/cd,但在 Shell 中輸入 cd 時,執行的不是這個檔案,而是 Shell 的內建指令。要確認是不是內建指令,可以用 [type cd],會出現 [cd is a shell builtin]。
✅ Linux whereis 指令
whereis 會用指令名稱同時找出執行檔與說明手冊。它與 PATH 無關,會搜尋 /usr/bin · /usr/sbin · /usr/lib64 · /etc · /usr/share 等固定資料夾,所以連同名的設定資料夾(/etc/httpd)也會出現。
| 選項 | 說明 | |
|---|---|---|
| -b | 只找執行檔。httpd 會顯示 /usr/sbin/httpd 與 /usr/lib64/httpd · /etc/httpd · /usr/share/httpd | |
| -m | 只找說明手冊(/usr/share/man · /usr/share/info) | |
| -s | 只找原始碼。在 AlmaLinux 9.8 的預設安裝中,只會像 [httpd:] 這樣顯示名稱 | |
| -l | whereis 搜尋的資料夾清單 |
~]# 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.gz找不到時,只會像 [htop:] 這樣顯示名稱。which 找不到時會回傳結束代碼 1,whereis 則回傳 0,所以在腳本中確認是否已安裝時,要用 which。
✅ Linux locate 指令
locate 不會搜尋磁碟,而是從事先建立的 DB 中尋找名稱。所以速度很快,但找不到 DB 建立之後才新增的檔案。
~]# dnf -y install mlocate
~]# updatedb安裝後立刻輸入的話,因為還沒有 DB,會出現 [locate: can not stat () `/var/lib/mlocate/mlocate.db’: No such file or directory];執行一次 updatedb 就會建立 DB。之後 mlocate-updatedb.timer 會每天重新建立一次 DB。
新建立的檔案在 updatedb 之前不會出現,已刪除的檔案則在 updatedb 之前都會持續出現。只想看目前存在的檔案時,請加上 -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.txt/etc/updatedb.conf 的 PRUNEPATHS 中包含 /tmp · /var/tmp · /mnt · /media,所以這些資料夾中的檔案,就算執行 updatedb 也不會出現。
🔲 locate 指令選項
| 選項 | 說明 | |
|---|---|---|
| -i | 不區分大小寫搜尋 | |
| -c | 只顯示找到的數量,不顯示路徑 | |
| -l= -n | 後面加上數字,只顯示到該數量為止。-l 3 | |
| -b | 只在路徑最後的檔案名稱中搜尋 | |
| -e | DB 中有、但目前已不存在的檔案會排除 | |
| -S | DB 資訊(資料夾數 · 檔案數 · 大小) | |
| -r | 用正規表示式搜尋。locate -r “httpd.conf$” |
ℹ️ 聯盟行銷說明
本站內容包含聯盟行銷連結。訪客透過這些連結購買商品或服務時,本站會從賣家獲得佣金。在這個過程中,購買者支付的金額(遇到活動折扣時金額會降低↓)並不會因此提高。刊登的價格、折扣與庫存資訊以撰寫當時為準,可能與實際情況不同,購買前請向賣家做最後確認。商品的挑選與評價依本站自訂的標準撰寫,是否支付佣金不會影響介紹順序或評價內容。