which whereis locate which 查看可執行文件的位置。 whereis 查看文件的位置。 locate 配合資料庫查看文件位置。 which 查找環境變數中的文件 which 命令用於查找並顯示給定命令的絕對路徑,環境變數 PATH 中保存了查找命令時需要遍歷的目錄。which ...
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