標籤:

如何高效地在 Linux 中搜索文件?

在 Linux 中搜索文件有幾個常用的命令: find、locate、which、whereis、grep 等。

1. find

首先來介紹一下 find,find 命令的語法是:

find [搜索路徑] [匹配條件]

find 命令的選項非常多,常用的有這麼幾個:

1.1 根據名稱查找

1.1.1 區分大小寫 -name

find /etc -name init

該命令的功能是在 etc 目錄下查找 文件名為 init 的文件。和 Windows 不同的是,這種查找方式是完全匹配,也就是只匹配文件名為 init 的文件,而不是只要文件名中含有 init 就會被匹配到。

如果想模糊匹配,需要使用通配符:find /etc -name *init*

如果想查找以 init 開頭的文件,可以這樣查找:find /etc -name init*

如果想查找以 init 開頭,並且後面緊跟 3 個字元的文件,可以這樣查找:find /etc -name init???

這個選項只會查找跟 init 有關的文件,而不會查找跟 INIT 有關的文件。如果想在查找時不區分大小寫。要用下面這個選項。

1.1.2 不區分大小寫 -iname

find /etc -iname init

這個命令的功能和上面 1.1 中的命令功能一樣,唯一的區別就是在查找時不區分文件名中字母的大小寫。

1.2 根據文件大小查找 -size

find / -size +204800

這條命令的功能是,在根目錄下查找大於 100MB 的文件。因為它的單位是數據塊,而一個數據塊是 0.5KB,所以 100MB 是 204800 個數據塊,所以要寫 204800。

若把「+」換成「-」,就是查找小於 100MB 的文件;若換成「=」,就是查找等於 100MB 的文件。

1.3 根據所有者查找 -user

find /home -user root

這條命令的功能是,在 home 目錄下查找所有者為 root 用戶的文件

1.4 根據所有組查找 -group

find /home -group root

這條命令的功能是,在 home 目錄下查找所有組為 group 的文件。

1.5 根據時間查找

find /etc -cmin -5

這條命令的功能是,在 /etc 下查找 5 分鐘內被修改過屬性的文件和目錄。如果是超過 5 分鐘,就寫「+5」,也就是:find /etc -cmin +5

下面是幾個類似的選項:

  • -amin 訪問時間(a - access)
  • -cmin 文件屬性(c - change)
  • -mmin 文件內容 (m - modify)

1.6 根據文件類型查找 -type

find /etc -type f

這條命令的功能是查找 etc 目錄下的所有文件。

若把 f 換成 d,則是查找 etc 目錄下的所有目錄;

若把 f 換成 l(小寫字母),則是查找 etc 目錄下的所有軟鏈接文件。

1.7 連接符 -a、-o

若查找的條件有多個,可通過連接符將不同的選項連接起來。其中,「-a」表示 and,即通過「-a」連接的多個條件要同時滿足,「-o」表示 or,通過「-o」連接的多個條件只滿足其中一個即可。

例如,在 etc 目錄下查找大於 80 MB,小於 100MB 的文件:

find /etc -size +163840 -a -size -204800

再例如,在 etc 目錄下查找以 init 開頭的文件。注意:只是查找文件,不包含目錄。

find /etc -name init* -a -type f

1.8 對搜索結果執行操作

1.8.1 -exec

find /etc -name inittab -exec ls -l {} ;

這條命令的功能是查找 etc 目錄下的名為 inittab 的文件,然後查看它的詳細信息。「-exec」後面跟要對搜索結果做的操作。

當然也可以和上面的連接符一起用,比如:

find /etc -size +163840 -a -size -204800 -exec ls -l {} ;

這條命令的作用是在 etc 目錄下查找大於 80 MB,小於 100MB 的文件,然後列出他們的詳細信息。

1.8.2 -ok

如果把「-exec」換成「-ok」,那麼在對每個文件執行操作之前,都會詢問你是否要執行。

1.9 根據文件的 i 節點查找 -num

find . -inum 142722

查找當前目錄下 i 節點為 142722 的文件。「.」表示當前文件。

PS:因為硬鏈接是不能跨分區的,利用這個命令可以找到一個文件的硬鏈接。

2. locate

find 命令已經如此強大,為什麼還需要 locate呢?因為 find 命令是通過遍歷磁碟來查找文件,故需要佔用非常多的系統資源,搜索速度相對較慢,而 locate 命令是在 Linux 系統內的一個文件資料庫中查找你所需要的文件,而不是直接遍歷磁碟,所以查找速度比 find 快很多。locate 最常見的一種使用方式是在 locate 命令後面直接跟一個文件名,就像這樣:

locate init

這條命令會把所有包含 init 的文件或目錄都搜索出來,注意,locate 後面直接跟文件名的話,是區分大小寫的,要想讓它在查找過程中不區分大小寫,可以加一個選項「-i」,就像下面這樣:

locate -i init

locate 命令雖然搜索速度快,但是如果創建一個文件後立馬搜索這個文件會搜不到,因為這個文件還沒被更新到文件資料庫里去。這個時候可以手動更新一下資料庫,用下面這個命令:

updatedb

然後再去搜索剛才創建的文件,就可以搜的到了。

2.1 locate 的缺點

在使用 locate 的時候,要注意一個問題,就是 locate 是找不到存放在 tmp 目錄下的文件的,因為 tmp 目錄不在 locate 的查找範圍之內。

3. which

which 是查找命令文件的命令。比如說我想查找 ls 這個命令在哪個目錄下,就可以使用 which 來進行查找:

which ls

4. whereis

whereis 和 which 的功能差不多,用法也是後面跟一個要查找的命令,都是用來查找命令文件的。查找結果除了顯示命令所在的命令以外,where 不會列出要查找的命令的別名相關的信息,而是會列出這個命令的幫助文檔所在的目錄。

看一下具體的例子:

whereis rm

下面是命令運行結果:

5. grep

5.1 直接查找

grep 這個命令比較特殊,它不像前幾個命令一樣是查找某一個文件,而是查找文件內容。用法就是 grep 命令後面跟關鍵詞,然後跟要查找的文件。比如:

grep multiuser /etc/inittab

這個命令的作用是在 etc 目錄下的 inittab 文件中查找關鍵字 multiuser,然後將該關鍵字所在的行顯示出來。下面是命令運行結果:

5.2 不區分大小寫 -i

上面那種查找方式是嚴格區分大小寫的,如果不想區分大小寫,那麼可以在 grep 後面加一個選項「-i」,比如:

grep -i multiuser /etc/inittab

這個命令與上面那個命令作用類似,只是在查找關鍵詞時不區分大小寫了。該命令運行結果如下:

可以看到,該命令不僅搜索到了 multiuser 所在的行,還搜索到了 Multiuser 所在的行。

5.3 排除指定字元串 -v

在 Linux 的配置文件中,「#」代表注釋,如果我想看配置文件的內容,但是不想看注釋,就可以在搜索文件內容時排除「#」所在的行。就可以這樣做:grep -v # /etc/inittab

但是有的注釋並不是單獨一行,而是寫在配置語句的後面,這樣的話單純地排除「#」所在的行就會把配置語句也排除掉,造成誤傷。也就是說我們只能排除掉以「#」開頭的行,這種情況下應該這樣寫:

grep -v ^# /etc/inittab

以上就是為大家介紹的 Linux 裡面常用的文件搜索命令,希望能夠對大家有所幫助。

歡迎關注我的微信公眾號,掃描下方二維碼或微信搜索:AProgrammer,就可以找到我,我會持續為你分享 IT 技術。


推薦閱讀:

TAG:Linux |