which whereis locate
which 查看可執行檔案的位置,
whereis 查看檔案的位置,
locate 配合資料庫查看檔案位置,
which
查找環境變數中的檔案
which 命令用于查找并顯示給定命令的絕對路徑,環境變數 PATH 中保存了查找命令時需要遍歷的目錄,which 指令會在環境變數 $PATH 設定的目錄里查找符合條件的檔案,也就是說,使用 which 命令,就可以看到某個系統命令是否存在,以及執行的到底是哪一個位置的命令,
引數
引數:
-
-n<檔案名長度> 指定檔案名長度,指定的長度必須大于或等于所有檔案中最長的檔案名,
-
-p<檔案名長度> 與-n引數相同,但此處的<檔案名長度>包括了檔案的路徑,
-
-w 指定輸出時欄位的寬度,
-
-V 顯示版本資訊,
-
--skip-dot 跳過 PATH 中以點開頭的目錄
-
--skip-tilde 跳過 PATH 中以波形符號開頭的目錄
-
--show-dot 不要在輸出中將點擴展到當前目錄
-
--show-tilde 為 HOME 目錄(非根目錄)輸出波形
-
--tty-only 如果不在 tty 上,停止右邊的處理選項
-
--all, -a 列印 PATH 中的所有匹配項,而不僅僅是第一個
-
--read-alias, -i 從 stdin 中讀取別名串列
-
--skip-alias 忽略選項 --read-alias;不讀 stdin
-
--read-functions 從 stdin 讀取 shell 函式
-
--skip-functions 忽略選項 --read-functions;不讀 stdin
實際用法
-
顯示命令的路徑
[root@honey-master ~] which bash /usr/bin/bash [root@honey-master ~] which pwd /usr/bin/pwd [root@honey-master ~] which java /usr/bin/java [root@honey-master ~] which python3 /usr/bin/python3 [root@honey-master ~] which cd /usr/bin/cd
? which 是根據使用者所配置的 PATH 變數內的目錄去搜尋可運行檔案的,所以,不同的 PATH 配置內容所找到的命令當然不一樣的,
-
顯示命令的別名
[root@honey-master ~] which ls alias ls='ls --color=auto' /usr/bin/ls [root@honey-master ~] which which alias which='(alias; declare -f) | /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot' /usr/bin/which使用別名也依然可以完成同樣的操作
[root@honey-master ~] ls --color=auto /etc DIR_COLORS chrony.conf dnsmasq.conf glvnd issue.d localtime nanorc pkcs11 rc6.d shells tuned [root@honey-master ~] (alias; declare -f) | /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot ls alias ls='ls --color=auto' /usr/bin/ls
whereis
Linux whereis命令用于查找檔案,
該指令會在特定目錄中查找符合條件的檔案,這些檔案應屬于原始代碼、二進制檔案,或是幫助檔案,
該指令只能用于查找二進制檔案、源代碼檔案和man手冊頁,一般檔案的定位需使用locate命令,
語法
whereis [-bfmsu][-B <目錄>...][-M <目錄>...][-S <目錄>...][檔案...]
引數
此格式中,用 [] 括起來的都是可選選項,其中各個引數的含義分別是:
- -b:只查找二進制檔案,
- -B 目錄:只在指定的目錄下查找二進制檔案,
- -m:只查找說明檔案,
- -M 目錄:只在指定的目錄下查找說明檔案,
- -s:只查找原始代碼檔案,
- -S 目錄:只在指定的目錄下查找原始代碼檔案,
- -u:查找不包含指定型別的檔案,
- -f:不顯示檔案名前的路徑名稱,
這是這一命令的 man 頁面給出的解釋:
whereis 可以查找指定命令的二進制檔案、源檔案和幫助檔案, 被找到的檔案在顯示時,會去掉主路徑名,然后再去掉檔案的(單個)尾部擴展名 (如: .c),來源于源代碼控制的 s. 前綴也會被去掉,接下來,whereis 會嘗試在標準的 Linux 位置里尋找具體程式,也會在由 $PATH 和 $MANPATH 指定的路徑中尋找,
[root@honey-master etc] whereis bash
bash: /usr/bin/bash /usr/share/man/man1/bash.1.gz /usr/share/info/bash.info.gz
需要注意的是,輸出的第一個路徑才是你想要的結果,使用 whereis 命令,同時也會顯示幫助頁面和原始碼所在路徑,(如果能找到的情況下會顯示,但是在這一例中沒有找到)所以你在輸出中看見的第二個路徑就是幫助頁面檔案所在位置,
實體
-
如果你想只搜索,假設說,二進制檔案,你可以使用 -b 這一命令列選項,
[root@honey-master etc] whereis -b bash bash: /usr/bin/bash -
只查找說明檔案
[root@honey-master etc] whereis -m bash bash: /usr/share/man/man1/bash.1.gz /usr/share/info/bash.info.gz -
默認情況下,whereis 是從由匹配符所定義的硬編碼路徑來尋找檔案的,但如果你想的話,你可以用命令列選項來限制搜索,例如,如果你只想在 /usr/bin 尋找二進制檔案,你可以用 -B 這一選項來實作,
[root@honey-master etc] whereis -B /usr/bin/ -f cp cp: /usr/share/man/man1/cp.1.gz /usr/share/man/man1p/cp.1p.gz /usr/bin/cp注意:使用這種方式時可以給出多個路徑,使用 -f 這一選項來明確分隔目錄串列和要搜索的檔案名,
-
查看whereis的搜索路徑
[root@honey-master etc] whereis -l bin: /usr/bin bin: /usr/sbin bin: /usr/lib bin: /usr/lib64 bin: /etc ... -
對于 whereis 命令來說,如果一個命令對每個顯式的請求型別都不止一項,則該命令被視為例外,例如,沒有可用檔案的命令,或者對應檔案分散在各處的命令都可以算作例外命令, 當使用 -u 這一選項,whereis 就會顯示那些有例外條目的命令,
例如,下面這一例子就顯示,在當前目錄中,沒有對應檔案或有多個檔案的命令,
[root@honey-master etc] whereis -m -u * at: /usr/share/man/man1/at.1.gz /usr/share/man/man1p/at.1p.gz crontab: /usr/share/man/man1/crontab.1.gz /usr/share/man/man1p/crontab.1p.gz /usr/share/man/man5/crontab.5.gz dconf: /usr/share/man/man1/dconf.1.gz /usr/share/man/man7/dconf.7.gz gcrypt: /usr/share/info/gcrypt.info-1.gz /usr/share/info/gcrypt.info-2.gz /usr/share/info/gcrypt.info.gz gnupg: /usr/share/man/man7/gnupg.7.gz /usr/share/info/gnupg.info-1.gz /usr/share/info/gnupg.info-2.gz /usr/share/info/gnupg.info.gz hostname: /usr/share/man/man1/hostname.1.gz /usr/share/man/man5/hostname.5.gz /usr/share/man/man7/hostname.7.gz java: /usr/share/man/man1/java.1.gz /usr/share/man/man1/java.1 locale: /usr/share/man/man1/locale.1.gz /usr/share/man/man1p/locale.1p.gz /usr/share/man/man3/locale.3pm.gz /usr/share/man/man5/locale.5.gz
which和whereis的區別
which命令是查找某個命令的完整路徑,也就是說它是用來查找可執行檔案的,which命令的原理是在當前登錄用戶的PATH環境變數記錄的路徑中進行查找,which命令使用例子:
which passwd(查找passwd命令的二進制檔案路徑)
而whereis命令則是用來快速查找任何檔案,注意是任何檔案,所以是一個檔案搜索命令,它和另一個檔案搜索命令locate的功能是一樣的,比如如果輸入:whereis passwd,那么找到的結果就比which命令找到的內容多,因為which命令只會列出二進制檔案路徑,而whereis命令會把所有帶有passwd字樣的檔案路徑都列舉出來,
locate
Linux locate命令用于查找符合條件的檔案,他會去保存檔案和目錄名稱的資料庫內,查找合乎范本樣式條件的檔案或目錄,
一般情況我們只需要輸入 locate your_file_name 即可查找指定檔案,locate 與 find不同: find 是去硬碟找,locate 只在 /var/lib/slocate 資料庫中找,
語法
locate [-d ][--help][--version][范本樣式...]
引數:
- -b, --basename -- 僅匹配路徑名的基本名稱
- -c, --count -- 只輸出找到的數量
- -d, --database DBPATH -- 使用 DBPATH 指定的資料庫,而不是默認資料庫 /var/lib/mlocate/mlocate.db
- -e, --existing -- 僅列印當前現有檔案的條目
- -1 -- 如果 是 1.則啟動安全模式,在安全模式下,使用者不會看到權限無法看到的檔案,這會始速度減慢,因為 locate 必須至實際的檔案系統中取得檔案的權限資料,
- -0, --null -- 在輸出上帶有NUL的單獨條目
- -S, --statistics -- 不搜索條目,列印有關每個資料庫的統計資訊
- -q -- 安靜模式,不會顯示任何錯誤訊息,
- -P, --nofollow, -H -- 檢查檔案存在時不要遵循尾隨的符號鏈接
- -l, --limit, -n LIMIT -- 將輸出(或計數)限制為LIMIT個條目
- -n -- 至多顯示 n個輸出,
- -m, --mmap -- 被忽略,為了向后兼容
- -r, --regexp REGEXP -- 使用基本正則運算式
- --regex -- 使用擴展正則運算式
- -q, --quiet -- 安靜模式,不會顯示任何錯誤訊息
- -s, --stdio -- 被忽略,為了向后兼容
- -o -- 指定資料庫存的名稱,
- -h, --help -- 顯示幫助
- -i, --ignore-case -- 忽略大小寫
- -V, --version -- 顯示版本資訊
locate 讀取一個或多個由 updatedb 更新的資料庫,并將至少與 PATTERN 之一匹配的檔案名寫入標準輸出,每行一個, 如果未指定 --regex,則 PATTERN 可以包含通配符, 如果任何 PATTERN 不包含通配符,則 locate 的行為就像模式是 PATTERN 一樣,默認情況下, locate 不檢查在資料庫中找到的檔案是否仍然存在(但如果資料庫是使用 --require-visibility no 構建的,它確實要求所有父目錄都存在),locate 永遠不會報告在相關資料庫的最新更新之后創建的檔案,
實體
-
查找passwd檔案

結果一不小心出了錯,locate是Linux系統中的一個查找(定位)檔案命令,和find命令等找尋檔案的作業原理類似,但 locate是通過生成一個檔案和檔案夾的索引資料庫,當用戶在執行loacte命令查找檔案時,它會直接在索引資料庫里查找,若該資料庫太久沒更新或不存在,在查找檔案時就提示:
“locate: can not open /var/lib/mlocate/mlocate.db': No such file or directory”[root@honey-master etc] updatedb 這個命令代表更新系統資料庫 [root@honey-master etc] locate passwd /etc/passwd /etc/passwd- /etc/nginx/sites-enabled/.ngpasswd ..... -
搜索etc目錄下面所有以sh開頭的檔案:這個命令并不是絕對目錄從/etc開始的,而是路徑中包含/etc的
[root@honey-master etc] locate /etc/sh /etc/shadow /etc/shadow- /etc/shells /opt/ratel/src/ratel/pot/cowrie/honeyfs/etc/shadow /var/lib/docker/overlay2/05de095b00667b554845f30b9de77132c60f40a2c3147fc53b12fa8f3dbec898/diff/etc/shells /var/lib/docker/overlay2/0cf774c1dd10317a356c67829df496748a6aec6e54e8b66aab39e1d16f7c4922/diff/etc/shadow -
忽略大小寫搜索當前用戶目錄下所有以 ra 開頭的檔案 :
[root@honey-master etc] locate -i ~/ra /var/lib/docker/overlay2/0f8abd62de9ec6fc1fa25f18cae942d529577b35c9734af4dd68e2e5e4d28803/diff/root/rasp-2022-01-28 /var/lib/docker/overlay2/0f8abd62de9ec6fc1fa25f18cae942d529577b35c9734af4dd68e2e5e4d28803/diff/root/rasp-2022-01-28/RaspInstall.jar /var/lib/docker/overlay2/0f8abd62de9ec6fc1fa25f18cae942d529577b35c9734af4dd68e2e5e4d28803/diff/root/rasp-2022-01-28/rasp /var/lib/docker/overlay2/0f8abd62de9ec6fc1fa25f18cae942d529577b35c9734af4dd68e2e5e4d28803/diff/root/rasp-2022-01-28/rasp/conf /var/lib/docker/overlay2/0f8abd62de9ec6fc1fa25f18cae942d529577b35c9734af4dd68e2e5e4d28803/diff/root/rasp-2022-01-28/rasp/plugins /var/lib/docker/overlay2/0f8abd62de9ec6fc1fa25f18cae942d529577b35c9734af4dd68e2e5e4d28803/diff/root/rasp-2022-01-28/rasp/rasp-engine.jar /var/lib/docker/overlay2/0f8abd62de9ec6fc1fa25f18cae942d529577b35c9734af4dd68e2e5e4d28803/diff/root/rasp-2022-01-28/rasp/rasp.jar /var/lib/docker/overlay2/0f8abd62de9ec6fc1fa25f18cae942d529577b35c9734af4dd68e2e5e4d28803/diff/root/rasp-2022-01-28/rasp/conf/openrasp.yml /var/lib/docker/overlay2/0f8abd62de9ec6fc1fa25f18cae942d529577b35c9734af4dd68e2e5e4d28803/diff/root/rasp-2022-01-28/rasp/plugins/official.js /var/lib/docker/overlay2/65625bc03c4a1a5f1d41a0cea4c47758413387c31d9e0b91989cb97d7a368f3d/diff/root/rasp-java.tar.gz -
輸出數量
[root@honey-master etc] locate -i ~/ra -c 10

which是通過 PATH環境變數到該路徑內查找可執行檔案,所以基本的功能是尋找可執行檔案,
和find相比,whereis查找的速度非常快,這是因為linux系統會將系統內的所有檔案都記錄在一個資料庫檔案中,當使用whereis和locate時,會從資料庫中查找資料,而不是像find命令那樣,通過遍歷硬碟來查找,效率自然會很高,但是,該資料庫檔案并不是實時更新,默認情況下時一星期更新一次,因此,我們在用whereis和locate 查找檔案時,有時會找到已經被洗掉的資料,或者剛剛建立檔案,卻無法查找到,原因就是因為資料庫檔案沒有被更新,
當我們用whereis和locate無法查找到我們需要的檔案時,可以使用find,但是find是在硬碟上遍歷查找,因此非常消耗硬碟的資源,而且效率也非常低,因此建議大家優先使用whereis和locate,
本文來自博客園,作者:ivanlee717,轉載請注明原文鏈接:https://www.cnblogs.com/ivanlee717/p/16333584.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/484794.html
標籤:Linux
