linux命令_which&&whereis&&locate以及區別

来源:https://www.cnblogs.com/ivanlee717/archive/2022/06/01/16333584.html
-Advertisement-
Play Games

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

實際用法

  1. 顯示命令的路徑

    [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 配置內容所找到的命令當然不一樣的。

  1. 顯示命令的別名

    [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 命令,同時也會顯示幫助頁面和源碼所在路徑。(如果能找到的情況下會顯示,但是在這一例中沒有找到)所以你在輸出中看見的第二個路徑就是幫助頁面文件所在位置。

實例

  1. 如果你想只搜索,假設說,二進位文件,你可以使用 -b 這一命令行選項。

    [root@honey-master etc] whereis -b bash
    bash: /usr/bin/bash
    
  2. 只查找說明文件

    [root@honey-master etc] whereis -m bash
    bash: /usr/share/man/man1/bash.1.gz /usr/share/info/bash.info.gz
    
  3. 預設情況下,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 這一選項來明確分隔目錄列表和要搜索的文件名。

  4. 查看whereis的搜索路徑

    [root@honey-master etc] whereis -l
    bin: /usr/bin
    bin: /usr/sbin
    bin: /usr/lib
    bin: /usr/lib64
    bin: /etc
    ...
    
  5. 對於 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 永遠不會報告在相關資料庫的最新更新之後創建的文件。

實例

  1. 查找passwd文件

    image-20220601104234361

    結果一不小心出了錯,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
    .....
    
  2. 搜索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
    
  3. 忽略大小寫搜索當前用戶目錄下所有以 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
    
  4. 輸出數量

    [root@honey-master etc] locate -i ~/ra -c
    10
    

image-20220601105605189

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文講述如何查找資料庫里重覆的行。這是初學者十分普遍遇到的問題。方法也很簡單。這個問題還可以有其他演變,例如,如何查找“兩欄位重覆的行”(#mysql IRC 頻道問到的問題) 如何查找重覆行 第一步是定義什麼樣的行才是重覆行。多數情況下很簡單:它們某一列具有相同的值。本文采用這一定義,或許你對“重 ...
  • 📕 C++輸入輸出 目的:解決ACM模式下的輸入輸出問題 題目來源:牛客OJ練習場 第一題:計算多組a+b 輸入描述:輸入包括兩個正整數a,b(1 ⇐ a, b ⇐ 10^9),輸入數據包括多組。 輸出描述:輸出a+b的結果 示例 輸入: 1 5 10 20 輸出: 6 30 代碼: #inclu ...
  • 一、前言 小編最近公司有個新的需求,數據量比較大,要涉及到分庫分表。大概瞭解了一些主流的中間件,使用和網上資料比較多的是Mycat和sharding-jdbc,小編比較傾向於Mycat。原因很簡單就是參考的資料比較多,教學比較多,小編經過一天的嘗試,終於完成了!這篇主要是實戰,一些知識點請自行百度, ...
  • 介紹 Elastic Stack 是一個可以幫助我們構建搜索體驗、解決問題並取得成功的搜索平臺。核心產品包括 Elasticsearch、Kibana、Beats 和 Logstash(也稱為 ELK Stack)等等。能夠安全可靠地獲取任何來源、任何格式的數據,然後實時地對數據進行搜索、分析和可視 ...
  • 一、開發背景 產品出設計稿要求做一個仿原生app簡訊驗證碼組件,花了兩小時搞出來一個還可以的組件,支持屏幕自適應,可以用於彈出框,或自己封裝的vue組件里,希望可以幫助那些被產品壓榨的同學,哈哈。😄 其核心思想就是利用一個輸入框使用css3,translate屬性,每輸入一次後向右位移一個單位位置 ...
  • 文件上傳和導入 控制器代碼 [Route("api/[controller]")] [ApiController] public class UpdController : ControllerBase { private readonly IWebHostEnvironment env; priv ...
  • 為什麼要使用Vuepress VuePress由兩部分組成:一個極簡的靜態站點生成器,帶有一個vue支持的主題系統和Plugin API,以及一個為編寫技術文檔而優化的預設主題。創建它是為了支持Vue自己的子項目的文檔需求。 由VuePress生成的每個頁面都有自己的預渲染靜態HTML,提供了良好的 ...
  • 本文例子參考《STM32單片機開發實例——基於Proteus虛擬模擬與HAL/LL庫》 源代碼:https://github.com/LanLinnet/STM33F103R6 項目要求 理解H橋電路的工作原理,結合前面幾個項目學習過的PWM、EXTI、串口通訊等,要求通過5個按鈕控制直流電動機的運 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...