Linux常用命令之文件查找which、find、locate命令講解
- 2020 年 8 月 5 日
- 筆記
在之前的課程中,我們介紹了Linux系統的常用文件處理命令和權限管理命令,今天我們繼續來學習Linux操作系統的其他處理命令。
1、文件搜索命令 which
命令解釋
- 命令名稱:
which
- 命令所在路徑:
/usr/bin/which
- 執行權限:所有用戶
- 命令功能:顯示系統命令所在目錄
- 語法:
which [命令名稱]
使用舉例
比如我們想要查找 ls
命令所在目錄:
$ which ls
注意:
which
命令只能用於查找命令所在路徑,不能查找普通文件,比如想用該命令查找名為ffile1的文件,執行which file1
之後是會提示no file
:
相關命令
與 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
的文件。
但是在有些情況下,我們確實需要進行模糊查找,比如忘記了文件的全名,可能只記得文件名是dnf
開頭,那麼我們可以用一個通配符 *
來進行查找:
$ find /etc -name dnf*
大家可以看到,為我查找出來了5個以dnf
開頭的文件,其中包含了全名是dnf
的文件,因此我們可以清楚 *
號是匹配任意字符。
還有一種情況,比如我清晰的記得文件是dnf
開頭的,文件全名有8個字符,後面5個字符不記得了。在這種情況下,我們可以用 ?
來進行輔助查找,一個?
匹配一個字符:
$ find /etc -name dnf?????
我們可以看到,為我查找出了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 {} \;
大家肯定很疑惑這條命令中 {} \;
是什麼意思,其實這個是固定格式,大家記住就行了。{}
表示 find
查詢的結果
3、locate
命令使用詳解
- 命令名稱:
locate
- 指令英文原義:
list files in databases
- 命令所在路徑:
/usr/bin/find
- 執行權限:所有用戶
- 命令功能:尋找文件或目錄
- 語法:
locate [查找關鍵字]
該命令在unix系統裏面不提供,只有Linux系統才有
使用舉例
比如要查找 service
的文件:
$ locate service
執行這條命令,大家會發現查找速度非常快,比 find
命令查找文件快多了。那有些同學就會說,我就用 locate
命令查找文件,幹嘛還要 find
命令呢?
為解答這個問題,我們先創建一個新的文件,比如我在 test
目錄新建一個 file3
的文件,然後再執行命令 $ locate file3
,發現並沒有查找結果,但是這個文件缺失是存在的。
這是為什麼呢?因為執行 locate
命令查找,是通過Linux文件數據庫去查找,並不是掃描磁盤,因此查找速度會要比 find
查找快很多。而我剛新建的文件,並沒有同步到Linux的文件數據庫裏面去,因此通過 locate
是查找不到的。那麼我們如何把新建的文件同步到Linux文件數據庫呢?有兩種方式:
- 等待Linux系統自動執行任務
- 手動執行同步命令
所以接下來我們來講解Linux的另外一個命令:updatedb
4、updatedb
命令使用詳解
- 命令名稱:
updatedb
- 指令英文原義:
update the slocate database
- 命令所在路徑:
/usr/bin/updatedb
- 執行權限:所有用戶
- 命令功能:建立系統目錄文件的數據庫
- 語法:
updatedb
$ updatedb
5、grep
命令使用詳解
- 命令名稱:
grep
- 命令所在路徑:
/bin/grep
- 執行權限:所有用戶
- 命令功能:在文件中搜索字符串匹配的行並輸出
- 語法:
grep [指定字符] [源文件]
注意:這個命令並不是搜索文件,而是在文件中搜索匹配的字符串,並輸出這一行。但是
grep
的作用不僅僅如此,後面教程中我們會繼續介紹該命令的使用。
使用舉例
比如我要查找 /etc/services
文件裏面的 tftp
相關的,如果我們直接用之前學習的命令比如 cat
、vim
、more
等命令,發現文件內容太長,太難找了,這種情況下我們執行:
$ grep tftp service
以上4種命令就是我們日常中使用最多的文件搜索相關的命令以及使用方法。