Linux find命令:在目錄中查詢檔案(超詳解)

2020-07-16 10:04:32
find 是 Linux 中強大的搜尋命令,不僅可以按照檔名搜尋檔案,還可以按照許可權、大小、時間、inode 號等來搜尋檔案。但是 find 命令是直接在硬碟中進行搜尋的,如果指定的搜尋範圍過大,find命令就會消耗較大的系統資源,導致伺服器壓力過大。所以,在使用 find 命令搜尋時,不要指定過大的搜尋範圍。

find 命令的基本資訊如下:
  • 命令名稱:find。
  • 英文原意:search for files in a directory hierarchy.
  • 所在路徑:/bin/find。
  • 執行許可權:所有使用者。
  • 功能描述:在目錄中查詢檔案。

命令格式

[[email protected]localhost ~]# find 搜尋路徑 [選項] 搜尋內容

find 是比較特殊的命令,它有兩個引數:
  • 第一個引數用來指定搜尋路徑;
  • 第二個引數用來指定搜尋內容。

而且find命令的選項比較複雜,我們一個一個舉例來看。

按照檔名搜尋

[[email protected] ~]#find 搜尋路徑 [選項] 搜尋內容

選項:
  • -name: 按照檔名搜尋;
  • -iname: 按照檔名搜尋,不區分檔名大小;
  • -inum: 按照 inode 號搜尋;

這是 find 最常用的用法,我們來試試:

[[email protected] ~]# find /-name yum.conf
/etc/yum.conf
#在目錄下査找檔名是yum.conf的檔案


但是 find 命令有一個小特性,就是搜尋的檔名必須和你的搜尋內容一致才能找到。如果只包含搜尋內容,則不會找到。我們做一個實驗:

[[email protected] ~]# touch yum.conf.bak
#在/root/目錄下建立一個檔案yum.conf.bak
[[email protected] ~]# find /-name yum.conf
/etc/yum.conf
#搜尋只能找到yum.conf檔案,而不能找到 yum.conf.bak 檔案

find 能夠找到的是只有和搜尋內容 yum.conf 一致的 /etc/yum.conf 檔案,而 /root/yum.conf.bak 檔案雖然含有搜尋鍵碼,但是不會被找到。這種特性我們總結為:find 命令是完全匹配的,必須和搜尋鍵碼一模一樣才會列出。

Linux 中的檔名是區分大小寫的,也就是說,搜尋小寫檔案,是找不到大寫檔案的。如果想要大小通吃,就要使用 -iname 來搜尋檔案。

[[email protected] ~]# touch CANGLS
[[email protected] ~]# touch cangls
#建立大寫和小寫檔案
[[email protected] ~]#find.-iname cangls
./CANGLS
./cangls
#使用-iname,大小寫檔案通吃

每個檔案都有 inode 號,如果我們知道 inode 號,則也可以按照 inode 號來搜尋檔案。

[[email protected] ~]#ls -i install.log
262147 install.log
#如果知道檔名,則可以用"ls -i"來査找inode號
[[email protected] ~]# find.-inum 262147
./install.log
#如果知道inode號,則可以用find命令來査找檔案

按照 inode 號搜尋檔案,也是區分硬連結檔案的重要手段,因為硬連結檔案的 inode 號是一致的。

[[email protected] ~]# ln /root/install.log /tmp/
#給install.log檔案建立一個硬連結檔案
[[email protected] ~]#ll -i /root/install.log /tmp/install.log
262147 -rw-r--r--.2 root root 24772 1 月 14 2014/root/
install.log
262147 -rw-r--r--.2 root root 24772 1 月 14 2014/tmp/
install.log
#可以看到這兩個硬連結檔案的inode號是一致的
[[email protected] ~]# find /-inum 262147
/root/install.log
/tmp/install.log
#如果硬連結不是我們自己建立的,則可以通過find命令搜尋inode號,來確定硬連結檔案

按照檔案大小搜尋

[[email protected] ~]#find 搜尋路徑 [選項] 搜尋內容

選項:
  • -size[+-]大小:按照指定大小搜尋檔案

這裡的"+"的意思是搜尋比指定大小還要大的檔案,"-" 的意思是搜尋比指定大小還要小的檔案。我們來試試:

[[email protected] ~]# ll -h install.log
-rw-r--r--.1 root root 25K 1月 14 2014 install.log #在當前目錄下有一個大小是25KB的檔案
[[email protected] ~]#
[[email protected] ~]# find.-size 25k
./install.log
#當前目錄下,査找大小剛好是25KB的檔案,可以找到
[[email protected] ~]# find .-size -25k
.
./.bashrc
./.viminfo
./.tcshrc
./.pearrc
./anaconda-ks.cfg
./test2
./.ssh
./.bash_history
./.lesshst
./.bash_profile
./yum.conf.bak
./.bashjogout
./install.log.syslog
./.cshrc
./cangls
#搜尋小於25KB的檔案,可以找到很多檔案
[[email protected] ~]# find.-size +25k
#而當前目錄下沒有大於25KB的檔案


其實 find 命令的 -size 選項是筆者個人覺得比較噁心的選項,為什麼這樣說?find 命令可以按照 KB 來搜尋,應該也可以按照 MB 來搜尋吧。

[[email protected] ~]# find.-size -25m
find:無效的-size型別"m"
#為什麼會報錯呢?其實是因為如果按照MB來搜尋,則必須是大寫的M

這就是糾結點,千位元組必須是小寫的"k",而兆位元組必領是大寫的"M"。有些人會說:"你別那麼執著啊,你就不能不寫單位,直接按照位元組搜尋啊?"很傻,很天真,不寫單位,你們就以為會按照位元組搜尋嗎?我們來試試:

[[email protected] ~]# ll anaconda-ks.cfg
-rw-------.1 root root 1207 1 月 14 2014 anaconda-ks.cfg
#anaconda-ks.cfg檔案有1207字芳
[[email protected] ~]# find.-size 1207
#但用find查詢1207,是什麼也找不到的

也就是說,find 命令的預設單位不是位元組。如果不寫單位,那麼 find 命令是按照 512 Byte 來進行査找的。 我們看看 find 命令的幫助。

[[email protected] ~]# man find
-size n[cwbkMG]
File uses n units of space. The following suffixes can be used:
'b' for 512-byte blocks (this is the default if no suffix is used)
#這是預設單位,如果單位為b或不寫單位,則按照 512Byte搜尋
'c' for bytes
#搜尋單位是c,按照位元組搜尋
'w' for two-byte words
#搜尋單位是w,按照雙位元組(中文)搜尋
'k'for Kilobytes (units of 1024 bytes)
#按照KB單位搜尋,必須是小寫的k
'M' for Megabytes (units of 1048576 bytes)
#按照MB單位搜尋,必須是大寫的M
'G' for Gigabytes (units of 1073741824 bytes)
#按照GB單位搜尋,必須是大寫的G

也就是說,如果想要按照位元組搜尋,則需要加搜尋單位"c"。我們來試試:

[[email protected] ~]# find.-size 1207c
./anaconda-ks.cfg
#使用搜尋單位c,才會按照位元組搜尋

按照修改時間搜尋

Linux 中的檔案有存取時間(atime)、資料修改時間(mtime)、狀態修改時間(ctime)這三個時間,我們也可以按照時間來搜尋檔案。

[[email protected] ~]# find搜尋路徑 [選項] 搜尋內容

選項:
  • -atime [+-]時間: 按照檔案存取時間搜尋
  • -mtime [+-]時間: 按照文改時間搜尋
  • -ctime [+-]時間: 按照檔案修改時間搜尋
這三個時間的區別我們在 stat 命令中已經解釋過了,這裡用 mtime 資料修改時間來舉例,重點說說 "[+-]"時間的含義。
  • -5:代表@內修改的檔案。
  • 5:代表前5~6天那一天修改的檔案。
  • +5:代表6天前修改的檔案。
我們畫一個時間軸,來解釋一下,如圖 1 所示。


圖 1 find時間軸