Linux常用命令之檔案查詢which、find、locate命令講解

九派Linux發表於2020-08-05

在之前的課程中,我們介紹了Linux系統的常用檔案處理命令和許可權管理命令,今天我們繼續來學習Linux作業系統的其他處理命令。

1、檔案搜尋命令 which 命令解釋

  • 命令名稱:which
  • 命令所在路徑: /usr/bin/which
  • 執行許可權:所有使用者
  • 命令功能:顯示系統命令所在目錄
  • 語法:which [命令名稱]

使用舉例

比如我們想要查詢 ls 命令所在目錄:

$ which ls

image

注意:which命令只能用於查詢命令所在路徑,不能查詢普通檔案,比如想用該命令查詢名為ffile1的檔案,執行 which file1之後是會提示no file:

image

相關命令

which 命令功能類似的命令 whereis,使用方法和which一樣,比如查詢 chmod命令所在位置:

$ whereis chmod

2、檔案搜尋命令 find 命令解釋

  • 命令名稱:find
  • 命令所在路徑: /usr/bin/find
  • 執行許可權:所有使用者
  • 命令功能:在指定目錄下查詢任何檔案或目錄
  • 語法:find [搜尋路徑] [引數] [查詢關鍵字]

其實這條命令有點類似於在我們windows系統裡面查詢檔案,只不過在Linux裡面是用命令列來查詢而已。find命令中,引數有幾十種,我們介紹常用的幾種。

使用舉例

一、根據檔名來查詢:比如我想在/etc目錄查詢名為dnf的檔案

$ find /etc -name dnf

大家可以看到,為我找出了2個名為dnf的檔案。這裡提醒一下大家,這裡查詢是全匹配查詢,並不是模糊查詢,意思是這裡只會為我查詢名稱全名為dnf的檔案,而不是查詢名稱包含dnf的檔案。

image

但是在有些情況下,我們確實需要進行模糊查詢,比如忘記了檔案的全名,可能只記得檔名是dnf開頭,那麼我們可以用一個萬用字元 * 來進行查詢:

$ find /etc -name dnf*

image

大家可以看到,為我查詢出來了5個以dnf開頭的檔案,其中包含了全名是dnf的檔案,因此我們可以清楚 * 號是匹配任意字元。

還有一種情況,比如我清晰的記得檔案是dnf開頭的,檔案全名有8個字元,後面5個字元不記得了。在這種情況下,我們可以用 ? 來進行輔助查詢,一個?匹配一個字元:

$ find /etc -name dnf?????

image

我們可以看到,為我查詢出了2個檔名為dnf開頭,全名是8個字元的檔案。

注意:使用 find 查詢檔案,佔用系統的資源越少越好,因此我們在查詢的時候,定位路徑越精確越好,查詢的關鍵字越全越好。而且最好不要在系統根目錄下面查詢,這樣會全盤掃描,會消耗系統的大量資源。

二、根據檔案大小來查詢: -size

這裡檔案大小一般都是以block資料庫塊來計算的,一個資料塊=512位元組,因此1KB=2個資料塊。比如我們要查詢檔案大小為1M的檔案:

$ find /etc -size +2048

大家注意,在數字2048前面我用了一個+號,表示檔案大於1M。如果是小於1M,我們可以用-號:

$ find /etc -size -2048

  • 根據檔案的所有者查詢: -user

比如我要查詢所有者為系統使用者chuan的使用者的檔案:

$ find /etc -user chuan

三、根據時間來查詢

這個屬性有點複雜,可以按照天來查詢,也可以按照分支來查詢:

天:ctime,atime,mtime

分鐘:cmin,amin,mmin

  • c-change:表示檔案的屬性被修改,包含所有者、所屬組、許可權
  • a-access:表示被訪問、瀏覽過
  • m-modify:表示檔案的內容被修改過

這裡還有個要注意的,就和我們在使用-size屬性一樣,有-+的輔助, - 表示之內,+ 超過。比如我們查詢2分鐘內被修改過的檔案:

$ find /etc -mmin -2

四、根據檔案型別來查詢:-type

常用的型別有二進位制檔案 f,軟連結檔案 l,目錄 d。比如我們要查詢型別為f的檔案:

$ find /etc -type f

如果我們想要在/home路徑查詢名稱為 up開頭的目錄,該如何查詢呢?這裡我們就要用到Linux查詢的連線符:

  • -a and 邏輯與連線
  • -o or 邏輯或連結

那麼我們的命令可以寫成:

$ find /home -name up* -a -type d

五、連線執行符:-exec

在上一個說到根據檔案型別來查詢的時候,我們有用到查詢連線符 -a-o,這裡再介紹一個相對複雜一點的連線符 -exec。意思是:在執行命令查詢完之後,再接著對執行結果進行操作。

比如我們查詢 /var/log 目錄下面檔名為 dnf 開頭的檔案,並列出這些檔案的屬性:

$ find /var/log -name dnf* -exec ls -l {} \;

image

大家肯定很疑惑這條命令中 {} \; 是什麼意思,其實這個是固定格式,大家記住就行了。{} 表示 find 查詢的結果

3、locate 命令使用詳解

  • 命令名稱:locate
  • 指令英文原義:list files in databases
  • 命令所在路徑: /usr/bin/find
  • 執行許可權:所有使用者
  • 命令功能:尋找檔案或目錄
  • 語法:locate [查詢關鍵字]

該命令在unix系統裡面不提供,只有Linux系統才有

使用舉例

比如要查詢 service 的檔案:

$ locate service

執行這條命令,大家會發現查詢速度非常快,比 find 命令查詢檔案快多了。那有些同學就會說,我就用 locate 命令查詢檔案,幹嘛還要 find 命令呢?

為解答這個問題,我們先建立一個新的檔案,比如我在 test 目錄新建一個 file3的檔案,然後再執行命令 $ locate file3,發現並沒有查詢結果,但是這個檔案缺失是存在的。

image

這是為什麼呢?因為執行 locate 命令查詢,是通過Linux檔案資料庫去查詢,並不是掃描磁碟,因此查詢速度會要比 find 查詢快很多。而我剛新建的檔案,並沒有同步到Linux的檔案資料庫裡面去,因此通過 locate 是查詢不到的。那麼我們如何把新建的檔案同步到Linux檔案資料庫呢?有兩種方式:

  • 等待Linux系統自動執行任務
  • 手動執行同步命令

所以接下來我們來講解Linux的另外一個命令:updatedb

4、updatedb 命令使用詳解

  • 命令名稱:updatedb
  • 指令英文原義:update the slocate database
  • 命令所在路徑: /usr/bin/updatedb
  • 執行許可權:所有使用者
  • 命令功能:建立系統目錄檔案的資料庫
  • 語法:updatedb

$ updatedb

image

5、grep 命令使用詳解

  • 命令名稱:grep
  • 命令所在路徑: /bin/grep
  • 執行許可權:所有使用者
  • 命令功能:在檔案中搜尋字串匹配的行並輸出
  • 語法:grep [指定字元] [原始檔]

注意:這個命令並不是搜尋檔案,而是在檔案中搜尋匹配的字串,並輸出這一行。但是 grep 的作用不僅僅如此,後面教程中我們會繼續介紹該命令的使用。

使用舉例

比如我要查詢 /etc/services 檔案裡面的 tftp相關的,如果我們直接用之前學習的命令比如 catvimmore等命令,發現檔案內容太長,太難找了,這種情況下我們執行:

$ grep tftp service

image

以上4種命令就是我們日常中使用最多的檔案搜尋相關的命令以及使用方法。

image

相關文章