Linux常用命令之文件查找which、find、locate命令講解

在之前的課程中,我們介紹了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