Linux常用命令之檔案查詢which、find、locate命令講解
阿新 • • 發佈:2020-08-05
在之前的課程中,我們介紹了Linux系統的常用檔案處理命令和許可權管理命令,今天我們繼續來學習Linux作業系統的其他處理命令。
1、檔案搜尋命令 `which` 命令解釋
- 命令名稱:`which`
- 命令所在路徑: `/usr/bin/which`
- 執行許可權:所有使用者
- 命令功能:顯示系統命令所在目錄
- 語法:`which [命令名稱]`
#### 使用舉例
比如我們想要查詢 `ls` 命令所在目錄:
> $ which ls
![image](https://cdn.guojiang.club/linux6-1.jpg)
> 注意:`which`命令只能用於查詢命令所在路徑,不能查詢普通檔案,比如想用該命令查詢名為ffile1的檔案,執行 `which file1`之後是會提示`no file`:
![image](https://cdn.guojiang.club/linux6-2.jpg)
#### 相關命令
與 `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](https://cdn.guojiang.club/linux6-3.jpg)
但是在有些情況下,我們確實需要進行模糊查詢,比如忘記了檔案的全名,可能只記得檔名是`dnf`開頭,那麼我們可以用一個萬用字元 `*` 來進行查詢:
> `$ find /etc -name dnf*`
![image](https://cdn.guojiang.club/linux6-5.jpg)
大家可以看到,為我查找出來了5個以`dnf`開頭的檔案,其中包含了全名是`dnf`的檔案,因此我們可以清楚 `*` 號是匹配任意字元。
還有一種情況,比如我清晰的記得檔案是`dnf`開頭的,檔案全名有8個字元,後面5個字元不記得了。在這種情況下,我們可以用 `?` 來進行輔助查詢,一個`?`匹配一個字元:
> `$ find /etc -name dnf?????`
![image](https://cdn.guojiang.club/linux6-6.jpg)
我們可以看到,為我查找出了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](https://cdn.guojiang.club/linux6-7.jpg)
大家肯定很疑惑這條命令中 `{} \;` 是什麼意思,其實這個是固定格式,大家記住就行了。`{}` 表示 `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](https://cdn.guojiang.club/linux6-8.jpg)
這是為什麼呢?因為執行 `locate` 命令查詢,是通過Linux檔案資料庫去查詢,並不是掃描磁碟,因此查詢速度會要比 `find` 查詢快很多。而我剛新建的檔案,並沒有同步到Linux的檔案資料庫裡面去,因此通過 `locate` 是查詢不到的。那麼我們如何把新建的檔案同步到Linux檔案資料庫呢?有兩種方式:
- 等待Linux系統自動執行任務
- 手動執行同步命令
所以接下來我們來講解Linux的另外一個命令:`updatedb`
4、`updatedb` 命令使用詳解
- 命令名稱:`updatedb`
- 指令英文原義:`update the slocate database`
- 命令所在路徑: `/usr/bin/updatedb`
- 執行許可權:所有使用者
- 命令功能:建立系統目錄檔案的資料庫
- 語法:`updatedb`
> `$ updatedb`
![image](https://cdn.guojiang.club/linux6-9.jpg)
5、`grep` 命令使用詳解
- 命令名稱:`grep`
- 命令所在路徑: `/bin/grep`
- 執行許可權:所有使用者
- 命令功能:在檔案中搜索字串匹配的行並輸出
- 語法:`grep [指定字元] [原始檔]`
> 注意:這個命令並不是搜尋檔案,而是在檔案中搜索匹配的字串,並輸出這一行。但是 `grep` 的作用不僅僅如此,後面教程中我們會繼續介紹該命令的使用。
#### 使用舉例
比如我要查詢 `/etc/services` 檔案裡面的 `tftp`相關的,如果我們直接用之前學習的命令比如 `cat`、`vim`、`more`等命令,發現檔案內容太長,太難找了,這種情況下我們執行:
> `$ grep tftp service`
![image](https://cdn.guojiang.club/linux6-10.jpg)
以上4種命令就是我們日常中使用最多的檔案搜尋相關的命令以及使用方法。
![image](https://cdn.guojiang.club/linux_foote