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

聯盟行銷揭露 Ver 3.1
聯盟行銷揭露 Ver 3.2(僅限行動版)
測試環境RHEL 系列AlmaLinux 9.8root 帳號2026-10-07 確認
搜尋指令whichwhereislocate

有時會遇到想修改 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.gz

locate 只要名稱有一部分相符,就會列出所有路徑,所以輸入 [locate httpd.conf],除了設定檔之外,連說明手冊(httpd.conf.5.gz)和備份的副本也會出現。

在下方的虛擬伺服器中,選擇左側的 which · whereis · locate,標籤就會跟著改變,點選標籤就會輸入該指令。也可以直接用鍵盤輸入。

位置查詢指令模擬器AlmaLinux 9.8
[root@server work]#
只在瀏覽器中運作,不會動到實際的伺服器。在左側選擇指令,下方的標籤就會跟著改變,點選標籤就會輸入該指令。請用三個指令搜尋同一個 httpd 並比較結果;在 locate 中,請先建立新檔案,再於 updatedb 前後分別搜尋看看。操作亂掉時請按 [Start over],輸入 uknew help 會列出可用的指令。

要依大小或修改日期、而不是依名稱尋找檔案時,請使用 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/ping

AlmaLinux 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:] 這樣顯示名稱
-lwhereis 搜尋的資料夾清單
~]# 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只在路徑最後的檔案名稱中搜尋
-eDB 中有、但目前已不存在的檔案會排除
-SDB 資訊(資料夾數 · 檔案數 · 大小)
-r用正規表示式搜尋。locate -r “httpd.conf$”

ℹ️ 聯盟行銷說明
本站內容包含聯盟行銷連結。訪客透過這些連結購買商品或服務時,本站會從賣家獲得佣金。在這個過程中,購買者支付的金額(遇到活動折扣時金額會降低↓)並不會因此提高。刊登的價格、折扣與庫存資訊以撰寫當時為準,可能與實際情況不同,購買前請向賣家做最後確認。商品的挑選與評價依本站自訂的標準撰寫,是否支付佣金不會影響介紹順序或評價內容。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Prove your humanity: 6   +   6   =