Linux 中 find 命令的七個(gè)強(qiáng)大用途
可以說,在 Linux 中,find 命令是后端開發(fā)人員必須掌握的操作之一,除非你在使用 Windows Server。
在技術(shù)面試中,它也是一個(gè)常見的話題。讓我們看一個(gè)真實(shí)的問題:
如果在你的Linux服務(wù)器上有一個(gè)名為 logs 的目錄,如何刪除其中上次訪問時(shí)間超過一年的日志文件???
這種情況很常見,但令人驚訝的是,并不是每個(gè)開發(fā)人員都能在面試中清晰地寫出這個(gè)命令。
答案:首先,我們需要使用 cd 命令進(jìn)入相應(yīng)的目錄,然后,命令如下:
linuxmi@linuxmi:~/www.linuxmi.com$ find . -type f -atime +365 -exec rm -rf {} \;
如果你對(duì)上述命令還不完全理解,不用擔(dān)心。本文將介紹 find 命令的 7 個(gè)實(shí)用用途,你最終會(huì)掌握它。如果你已經(jīng)知道了,閱讀本文將是一個(gè)很好的復(fù)習(xí)。
1、根據(jù)文件名或正則表達(dá)式查找文件
讓我們從最簡(jiǎn)單的用法開始。要按特定名稱搜索文件,命令如下:
linuxmi@linuxmi:~/www.linuxmi.com$ find . -name linuxmi.sh
上述代碼中的.符號(hào)表示當(dāng)前路徑。如果我們想要搜索另一個(gè)路徑下的文件,只需指定即可:
linuxmi@linuxmi:~/www.linuxmi.com$ find /home/linuxmi/linuxmi.com -name linuxmi.png
如何找到所有格式為 png 的圖像?使用正則表達(dá)式:
find /home/linuxmi/linuxmi.com -name "*.png"
默認(rèn)情況下,find 命令搜索常規(guī)文件,但最好指定類型以使一切更清晰:
find /home/linuxmi/linuxmi.com -type f -name "*.png"
2、查找不同類型的文件
除了搜索普通文件外,我們還可以通過指定-type選項(xiàng)來搜索其他類型的文件。
例如目錄:
find . -type d -name "linuxmi*"
或者符號(hào)鏈接:
find . -type l -name "linuxmi*"
3、按特定的時(shí)間戳查找文件
要按特定的時(shí)間戳搜索文件,我們需要了解Linux系統(tǒng)中的3種不同時(shí)間戳:
訪問時(shí)間戳(atime):文件上次被讀取的時(shí)間。
修改時(shí)間戳(mtime):文件內(nèi)容上次被修改的時(shí)間。
更改時(shí)間戳(ctime):文件的元數(shù)據(jù),例如所有權(quán)、位置、文件類型和權(quán)限設(shè)置等上次更改的時(shí)間。
所以,就像開始時(shí)提到的面試問題一樣,要搜索那些atime超過一年前的文件,我們可以編寫以下命令:
linuxmi@linuxmi:~$ find . -type f -atime +365
如果我們需要找到 mtime 恰好是 5 天前的文件,請(qǐng)不要包含 + 號(hào),因?yàn)樗硎尽按笥凇薄?/p>
linuxmi@linuxmi:~$ find . -type f -mtime 5
顯然,+號(hào)表示“大于”,-號(hào)表示“小于”。因此,我們可以搜索 ctime 在 5 到 10 天之間的文件:
linuxmi@linuxmi:~$ find . -type f -ctime +5 -ctime -10
4、按文件大小查找文件
-size選項(xiàng)使我們能夠按特定大小查找文件。我們可以使用以下約定指定其計(jì)量單位:
- b:512字節(jié)塊(默認(rèn))
- c:字節(jié)
- w:兩字節(jié)單詞
- k:千字節(jié)
- M:兆字節(jié)
- G:千兆字節(jié)
與按時(shí)間戳查找文件類似,+號(hào)表示“大于”,-號(hào)表示“小于”。例如,要查找大小在10兆字節(jié)和1千兆字節(jié)之間的文件:
find . -type f -size +10M -size -1G
5、按權(quán)限查找文件
適當(dāng)控制文件的權(quán)限是Linux管理員的重要任務(wù)。find命令的-perm選項(xiàng)可以幫助我們按特定權(quán)限搜索文件:
find . -type f -perm 777
例如,上述命令將搜索所有具有777權(quán)限的文件,這意味著文件對(duì)其所有者、組和所有用戶具有讀、寫和執(zhí)行權(quán)限。
6、按文件所有者查找文件
這個(gè)任務(wù)很簡(jiǎn)單。我們只需要在-user選項(xiàng)中指定一個(gè)用戶名。例如,以下命令將找到所有屬于 linuxmi 的文件:
find -type f -user linuxmi
7、在查找文件后執(zhí)行命令
在大多數(shù)情況下,我們希望在找到所需文件后執(zhí)行一些后續(xù)操作,例如刪除它們、檢查它們的詳細(xì)信息等等。-exec命令使所有這些操作變得更加簡(jiǎn)單。
現(xiàn)在,為了理解如何使用它,讓我們回到之前提到的面試問題:
find . -type f -atime +365 -exec rm -rf {} ;
上述命令中-exec選項(xiàng)后面是rm -rf,用于刪除文件。{}是找到的結(jié)果的占位符。
注意:占位符{}非常重要,特別是如果你想要?jiǎng)h除文件。因?yàn)槿绻悴皇褂盟?,命令將?duì)所有文件執(zhí)行,而不僅僅是通過find命令找到的文件。
為了嘗試一下,在終端上執(zhí)行以下兩個(gè)命令并檢查它們的結(jié)果有什么不同:
一個(gè)使用了占位符:
find . -type f -atime +5 -exec ls {} ;
另一個(gè)沒有使用:
find . -type f -atime +5 -exec ls ;
跟在-exec選項(xiàng)后面的命令必須以分號(hào)結(jié)束。正如我們所知,轉(zhuǎn)義字符用于取消單個(gè)字符的特殊含義。在Linux中,反斜杠\被用作轉(zhuǎn)義字符。因此,我們將其用于分號(hào)字符。
總結(jié)
閱讀完find命令的7個(gè)用途后,之前提到的面試問題現(xiàn)在看起來非常簡(jiǎn)單了?,F(xiàn)在你能直接寫出答案并清楚地解釋嗎?
find . -type f -atime +365 -exec rm -rf {};
find . -type f -atime +365 -exec rm -rf {};