使用 find 命令在 Linux 上查找文件和目錄
不管我決心如何組織文件,似乎總有無法找到文件的時候。有時是因為我不記得最初的文件名,其他時候,我知道名字,但我不記得在哪裡保存它了。甚至有時我需要一個我最初就沒有創建的文件。但是,無論遇到什麼困難,我知道在 POSIX 系統 上,總是有 find
命令可以幫助我。
安裝 find
find
命令由 POSIX 規範 定義,它創建了一個用于衡量 POSIX 系統的開放標準,這包括 Linux、BSD 和 macOS。簡而言之,只要你運行的是 Linux、BSD 或 macOS,那麼 find
已經安裝了。
但是,並非所有的 find
命令都完全相同。例如,GNU 的 find
命令有一些 BSD、Busybox 或 Solaris 上 find
命令可能沒有或有但實現方式不同的功能。本文使用 findutils 包中的 GNU find
,因為它很容易獲得且非常流行。本文演示的大多數命令都適用於 find
的其他實現,但是如果你在 Linux 以外的平台上嘗試命令並得到非預期結果,嘗試下載並安裝 GNU 版本。
按名稱查找文件
你可以藉助正則表達式使用完整或部分的文件名來定位文件。find
命令需要你給出想搜索的目錄;指定搜索屬性選項,例如,-name
用於指定區分大小寫的文件名;然後是搜索字元串。默認情況下,搜索字元串按字面意思處理:除非你使用正則表達式語法,否則 find
命令搜索的文件名正是你在引號之間輸入的字元串。
假設你的 Documents
目錄包含四個文件:Foo
、foo
、foobar.txt
和 foo.xml
。以下是對 foo
的字面搜索:
$ find ~ -name "foo"
/home/tux/Documents/examples/foo
你可以使用 -iname
選項使其不區分大小寫來擴大搜索範圍:
$ find ~ -iname "foo"
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo
通配符
你可以使用基本的 shell 通配符來擴展搜索。例如,*
表示任意數量的字元:
$ 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
?
表示單個字元:
$ find ~ -iname "foo*.???"
/home/tux/Documents/examples/foo.xml
/home/tux/Documents/examples/foobar.txt
這不是正則表達式語法,因此 .
在示例中只表示字母「點」。
正則表達式
你還可以使用正則表達式。與 -iname
和 -name
一樣,也有區分大小寫和不區分大小寫的選項。但不一樣的是,-regex
和 -iregex
搜索應用於整個路徑,而不僅僅是文件名。這意味著,如果你搜索 foo
,你不會得到任何結果,因為 foo
與 /home/tux/Documents/foo
不匹配。相反,你必須要麼搜索整個路徑,要麼在字元串的開頭使用通配符:
$ find ~ -iregex ".*foo"
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo
查找近一周修改過的文件
要查找近一周修改的文件,使用 -mtime
選項以及過去的天數(負數):
$ 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
查找近幾天修改的文件
你可以結合使用 -mtime
選項來查找近幾天範圍內修改的文件。對於第一個 -mtime
參數,表示上一次修改文件的最近天數。第二個參數表示最大天數。例如,搜索修改時間超過 1 天但不超過 7 天的文件:
$ find ~ -mtime +1 -mtime -7
按文件類型限制搜索
指定查找文件的類型來優化 find
的結果是很常見的。如果你不確定要查找的內容,則不應該使用此選項。但如果你知道要查找的是文件而不是目錄,或者是目錄而不是文件,那麼這可能是一個很好的過濾器。選項是 -type
,它的參數是代表不同類型數據的字母代碼。最常見的是:
d
- 目錄f
- 文件l
- 鏈接文件s
- 套接字p
- 命名管道(用於 FIFO)b
- 塊設備(通常是硬碟)
下面是一些例子:
$ 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
調整範圍
find
命令默認是遞歸的,這意味著它會在指定的目錄中層層搜索結果。這在大型文件系統中可能會變得不堪重負,但你可以使用 -maxdepth
選項來控制搜索深度:
$ find /usr -iname "*xml" | wc -l
15588
$ find /usr -maxdepth 2 -iname "*xml" | wc -l
15
也可以使用 -mindepth
設置最小遞歸深度:
$ find /usr -mindepth 8 -iname "*xml" | wc -l
9255
下載速查表
本文僅介紹 find
的基本功能,它是一個很好的搜索工具,但對於強大的 Parallel 命令來說,它也是一個非常有用的前端。學習 find
的原因有很多,所以 下載我們免費的 find
速查表 吧,它可以幫助你了解有關該命令的更多信息。
via: https://opensource.com/article/21/9/linux-find-command
作者:Seth Kenlon 選題:lujun9972 譯者:MjSeven 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive