使用 find 命令在 Linux 上查找文件和目錄
不管我決心如何組織文件,似乎總有無(wú)法找到文件的時(shí)候。有時(shí)是因?yàn)槲也挥浀米畛醯奈募?,其他時(shí)候,我知道名字,但我不記得在哪里保存它了。甚至有時(shí)我需要一個(gè)我最初就沒(méi)有創(chuàng)建的文件。但是,無(wú)論遇到什么困難,我知道在 POSIX 系統(tǒng) 上,總是有 find 命令可以幫助我。
安裝 find
find 命令由 POSIX 規(guī)范 定義,它創(chuàng)建了一個(gè)用于衡量 POSIX 系統(tǒng)的開(kāi)放標(biāo)準(zhǔn),這包括 Linux、BSD 和 macOS。簡(jiǎn)而言之,只要你運(yùn)行的是 Linux、BSD 或 macOS,那么 find 已經(jīng)安裝了。
但是,并非所有的 find 命令都完全相同。例如,GNU 的 find 命令有一些 BSD、Busybox 或 Solaris 上 find 命令可能沒(méi)有或有但實(shí)現(xiàn)方式不同的功能。本文使用 findutils 包中的 GNU find,因?yàn)樗苋菀撰@得且非常流行。本文演示的大多數(shù)命令都適用于 find 的其他實(shí)現(xiàn),但是如果你在 Linux 以外的平臺(tái)上嘗試命令并得到非預(yù)期結(jié)果,嘗試下載并安裝 GNU 版本。
按名稱查找文件
你可以借助正則表達(dá)式使用完整或部分的文件名來(lái)定位文件。find 命令需要你給出想搜索的目錄;指定搜索屬性選項(xiàng),例如,-name 用于指定區(qū)分大小寫(xiě)的文件名;然后是搜索字符串。默認(rèn)情況下,搜索字符串按字面意思處理:除非你使用正則表達(dá)式語(yǔ)法,否則 find 命令搜索的文件名正是你在引號(hào)之間輸入的字符串。
假設(shè)你的 Documents 目錄包含四個(gè)文件:Foo、foo、foobar.txt 和 foo.xml。以下是對(duì) foo 的字面搜索:
- $ find ~ -name "foo"
- /home/tux/Documents/examples/foo
你可以使用 -iname 選項(xiàng)使其不區(qū)分大小寫(xiě)來(lái)擴(kuò)大搜索范圍:
- $ find ~ -iname "foo"
- /home/tux/Documents/examples/foo
- /home/tux/Documents/examples/Foov
通配符
你可以使用基本的 shell 通配符來(lái)擴(kuò)展搜索。例如,* 表示任意數(shù)量的字符:
- $ find ~ -iname "foo*"
- /home/tux/Documents/examples/foo
- /home/tux/Documents/examples/Foo
- /home/tux/Documents/examples/foo.xml
- /home/tux/Documents/examples/foobar.txt
? 表示單個(gè)字符:
- $ find ~ -iname "foo*.???"
- /home/tux/Documents/examples/foo.xml
- /home/tux/Documents/examples/foobar.txt
這不是正則表達(dá)式語(yǔ)法,因此 . 在示例中只表示字母“點(diǎn)”。
正則表達(dá)式
你還可以使用正則表達(dá)式。與 -iname 和 -name 一樣,也有區(qū)分大小寫(xiě)和不區(qū)分大小寫(xiě)的選項(xiàng)。但不一樣的是,-regex 和 -iregex 搜索應(yīng)用于整個(gè)路徑,而不僅僅是文件名。這意味著,如果你搜索 foo,你不會(huì)得到任何結(jié)果,因?yàn)?foo 與 /home/tux/Documents/foo 不匹配。相反,你必須要么搜索整個(gè)路徑,要么在字符串的開(kāi)頭使用通配符:
- $ find ~ -iregex ".*foo"
- /home/tux/Documents/examples/foo
- /home/tux/Documents/examples/Foo
查找近一周修改過(guò)的文件
要查找近一周修改的文件,使用 -mtime 選項(xiàng)以及過(guò)去的天數(shù)(負(fù)數(shù)):
- $ find ~ -mtime -7
- /home/tux/Documents/examples/foo
- /home/tux/Documents/examples/Foo
- /home/tux/Documents/examples/foo.xml
- /home/tux/Documents/examples/foobar.txt
查找近幾天修改的文件
你可以結(jié)合使用 -mtime 選項(xiàng)來(lái)查找近幾天范圍內(nèi)修改的文件。對(duì)于第一個(gè) -mtime 參數(shù),表示上一次修改文件的最近天數(shù)。第二個(gè)參數(shù)表示最大天數(shù)。例如,搜索修改時(shí)間超過(guò) 1 天但不超過(guò) 7 天的文件:
- $ find ~ -mtime +1 -mtime -7
按文件類型限制搜索
指定查找文件的類型來(lái)優(yōu)化 find 的結(jié)果是很常見(jiàn)的。如果你不確定要查找的內(nèi)容,則不應(yīng)該使用此選項(xiàng)。但如果你知道要查找的是文件而不是目錄,或者是目錄而不是文件,那么這可能是一個(gè)很好的過(guò)濾器。選項(xiàng)是 -type,它的參數(shù)是代表不同類型數(shù)據(jù)的字母代碼。最常見(jiàn)的是:
- d - 目錄
- f - 文件
- l - 鏈接文件
- s - 套接字
- p - 命名管道(用于 FIFO)
- b - 塊設(shè)備(通常是硬盤(pán))
下面是一些例子:
- $ find ~ -type d -name "Doc*"
- /home/tux/Documents
- $ find ~ -type f -name "Doc*"
- /home/tux/Downloads/10th-Doctor.gif
- $ find /dev -type b -name "sda*"
- /dev/sda
- /dev/sda1
調(diào)整范圍
find 命令默認(rèn)是遞歸的,這意味著它會(huì)在指定的目錄中層層搜索結(jié)果。這在大型文件系統(tǒng)中可能會(huì)變得不堪重負(fù),但你可以使用 -maxdepth 選項(xiàng)來(lái)控制搜索深度:
- $ find /usr -iname "*xml" | wc -l
- 15588
- $ find /usr -maxdepth 2 -iname "*xml" | wc -l
- 15
也可以使用 -mindepth 設(shè)置最小遞歸深度:
- $ find /usr -mindepth 8 -iname "*xml" | wc -l
- 9255
下載速查表
本文僅介紹 find 的基本功能,它是一個(gè)很好的搜索工具,但對(duì)于強(qiáng)大的 Parallel 命令來(lái)說(shuō),它也是一個(gè)非常有用的前端。學(xué)習(xí) find 的原因有很多,所以 下載我們免費(fèi)的 find 速查表 吧,它可以幫助你了解有關(guān)該命令的更多信息。