Linux 上的
find
命令是findutil
軟件包的一部分,通常已經默認集成在了幾乎全部的發行版中。
find 命令有很是大的靈活性,能夠向其指定豐富的搜索條件(如文件權限、屬主、屬組、文件類型、日期和大小等)來定位系統中的文件和目錄。
此外,find 還支持對搜索到的結果進行多種類型的命令操做。python
find 命令的基本結構以下:find [paths] [expression] [actions]
linux
find 命令接受一個或多個路徑(paths)做爲搜索範圍,並在該路徑下遞歸地搜索。即檢索完指定的目錄後,還會對該目錄下的子目錄進行檢索,以及子目錄下的子目錄。。。直到到達目錄樹底部。express
默認狀況下(不帶任何搜索條件),find 命令會返回指定目錄下的全部文件,因此經常須要經過特定的 expression
對結果進行篩選。ruby
find 命令默認的 action
是將全部檢索結果打印至標準輸出。能夠經過自定義 action
,讓 find 命令對搜索到的結果執行特定的操做。ide
這裏先不作詳細解釋,簡單地測試下 find 命令:測試
$ tree directory
directory
├── file1
├── file2
├── sub-dir1 │ ├── file1 │ ├── file2 │ └── file3 └── sub-dir2 ├── file2 └── sub-subdir1 └── file1 3 directories, 7 files
$ find directory directory directory/sub-dir1 directory/sub-dir1/file3 directory/sub-dir1/file2 directory/sub-dir1/file1 directory/file2 directory/sub-dir2 directory/sub-dir2/file2 directory/sub-dir2/sub-subdir1 directory/sub-dir2/sub-subdir1/file1 directory/file1
$ find directory -name file2 directory/sub-dir1/file2 directory/file2 directory/sub-dir2/file2
-delete
表示刪除搜索結果)$ find directory -name file2 -delete $ find directory directory directory/sub-dir1 directory/sub-dir1/file3 directory/sub-dir1/file1 directory/sub-dir2 directory/sub-dir2/sub-subdir1 directory/sub-dir2/sub-subdir1/file1 directory/file1
find 命令中的 -name
選項能夠根據文件名稱進行檢索(區分大小寫)。如須要忽略文件名中的大小寫,可使用 -iname
選項。ui
-name
和 -iname
兩個選項都支持 wildcards 。如:spa
?
能夠表示任意一個單一的符號*
能夠表示任意數量(包括 0)的未知符號find /usr -name '*.txt'
查找 /usr 目錄下全部文件名以 .txt
結尾的文件find /usr -name '????'
查找 /usr 目錄下全部文件名恰好爲 4 個字符的文件code
有些時候,你須要在搜索時匹配某個文件或目錄的完整路徑,而不只僅是匹配文件名。可使用 -path
或 -ipath
選項。blog
如查找 /usr 下全部文件名以 .txt
結尾的文件或目錄,且該文件的父目錄必須是 src
。可使用如下命令:find /usr -path '*/src/*.txt'
若是隻想搜索獲得文件或目錄,即不想它們同時出如今結果中。可使用 -type
選項指定文件類型。
-type
選項最經常使用的參數以下:
find /usr -type d -name 'python*'
檢索 /usr 下全部文件名以 python
開頭的目錄
find 命令支持 -empty
選項用來檢索爲空的文件或目錄。空文件即文件裏沒有任何內容,空目錄即目錄中沒有任何文件或子目錄。
find ~ -type d -empty
檢索用戶主目錄下全部的空目錄
find 命令也容許用戶對當前的匹配條件進行「反義」(相似於邏輯非操做)。
如須要檢索 /usr 下全部文件名不以 .txt
爲後綴的文件。可使用如下命令:find /usr -type f ! -name '*.txt'
也能夠「翻轉」任何其餘的篩選條件,如:find /usr -type f ! -empty
檢索 /usr 下全部內容不爲空的文件
爲了檢索歸屬於特定用戶的文件或目錄,可使用 -user
選項。
find / -type f -user starky
檢索根目錄下全部屬主爲 starky 的文件
相似於 -user
選項,-group
選項則能夠根據文件或目錄的屬組進行檢索。
有些時候,須要根據文件建立或修改的時間進行檢索。
Linux 系統中,與文件相關聯的時間參數有如下三種:
與此對應的是 find 命令中的 -mtime
,-atime
和 -ctime
三個選項。
這三個選項的使用遵循如下示例中的規則:
-mtime 2
:該文件 2 天前被修改過-mtime -2
:該文件 2 天之內被修改過-mtime +2
:該文件距離上次修改已經超過 2 天時間find /usr -type f -mtime 2
檢索 /usr 下兩天前被修改過的文件
若是以爲 -mtime
等選項以天爲單位時間有點長,還可使用 -mmin
,-amin
,-cmin
三個選項:find /usr -type f -mtime +50 -mtime -100
檢索 /usr 下 50 到 100 天以前修改過的文件find /usr -type f -mtime 2 -amin 5
檢索 /usr 下兩天前被修改過且 5 分鐘前又讀取過的文件
-size
選項容許用戶經過文件大小進行搜索(只適用於文件,目錄沒有大小……)。
表示文件大小的單位由如下字符組成:
c
:字節k
:KbM
:MbG
:Gb另外,還可使用 +
或 -
符號表示大於或小於當前條件。
find / -size +1G
檢索文件大小高於 1 GB 的文件
find 命令可使用 -perm
選項以文件權限爲依據進行搜索。
如須要檢索 /usr 目錄下權限爲 rwxr-xr-x
的文件,可使用如下命令:find /usr -perm u=rwx,g=rx,o=rx
搜索 /usr 目錄下全部權限爲 r-xr-xr-x
(即系統中的全部用戶都只有讀寫權限)的文件和目錄,可使用如下命令:find /usr -perm a=rx
不少時候,咱們只想匹配文件權限的一個子集。好比,檢索能夠直接被任何用戶執行的文件,即只關心文件的執行權限,而不用管其讀寫權限是什麼。
上述的需求能夠經過如下命令實現:find / -type f -perm /a=x
其中 a=x
前面的 /
符號即用來表示只匹配權限的某個子集(執行權限),而不用關心其餘權限的具體設置。
-perm
選項也支持數字形式的文件權限標記。
find /usr -perm 644
搜索 /usr 目錄下權限爲 644(即 rwxr-xr-x
)的文件
find 命令默認是以遞歸的方式檢索項目的,這有時候會致使獲得的結果數量很是巨大。可使用 -maxdepth
限制 find 命令遞歸的層數。
find / -maxdepth 3
搜索時向下遞歸的層數最大爲 3
在以前的例子中有出現多個搜索條件的組合以及對某個搜索條件的反轉。
實際上 find 命令支持 「and」 和 「or」 兩種邏輯運算,對應的命令選項分別是 -a
和 -o
。經過這兩個選項能夠對搜索條件進行更復雜的組合。
此外還可使用小括號對搜索條件進行分組。注意 find
命令中的小括號常須要用單引號包裹起來。因小括號在 Shell 中有特殊的含義。
如檢索 /usr 下文件名以 python
開頭且類型爲目錄的文件find /usr -type d -name 'python*'
該命令等同於:find /usr -type d -a -name 'python*'
更復雜的組合形式如:find / '(' -mmin -5 -o -mtime +50 ')' -a -type f
-delete
選項能夠用來刪除搜索到的文件和目錄。
如刪除 home 目錄下全部的空目錄:find ~ -type d -empty -delete
-exec
選項能夠對搜索到的結果執行特定的命令。
如須要將 home 目錄下全部的 MP3 音頻文件複製到移動存儲設備(假設路徑是 /media/MyDrive
),可以使用下面的命令:find ~ -type f -name '*.mp3' -exec cp {} /media/MyDrive ';'
其中的大括號({}
)做爲檢索到的文件的 佔位符 ,而分號( ;
)做爲命令結束的標誌。由於分號是 Shell 中有特殊含義的符號,因此須要使用單引號括起來。
每當 find 命令檢索到一個符合條件的文件,會使用其完整路徑取代命令中的 {}
,而後執行 -exec
後面的命令一次。
另外一個很重要的用法是,在多個文件中檢索某個指定的字符串。
如在用戶主目錄下的全部文件中檢索字符串 hello
,可使用以下命令:find ~ -type f -exec grep -l hello {} ';'
建立 Gzip 格式的壓縮文件的命令爲:tar -czvf filename.tar.gz <list of files>
如今假設須要將用戶主目錄下全部的 MP3 文件添加到壓縮包 music.tar.gz
中,直觀的感受是,其命令應爲以下形式:find ~ -type f -name '*.mp3' -exec tar -czvf music.tar.gz {} ';'
實際狀況是,這樣獲得的 music.tar.gz
其實只包含一個 MP3 文件。
緣由是 find 命令每次發現一個音頻文件,都會再執行一次 -exec
選項後面的壓縮命令。致使先前生成的壓縮包被覆蓋。
能夠先讓 find 命令檢索出全部符合條件的音頻文件,再將獲得的文件列表傳遞給後面的壓縮命令。完整的命令以下:find ~ -type f -name '*.mp3' -exec tar -czvf music.tar.gz {} +
若是想瀏覽搜索到的文件(目錄)的詳細信息(如權限和大小等),能夠直接使用 -ls
選項。
find / -type file -size +1G -ls
瀏覽全部 1G 以上大小的文件的詳細信息
參數 | 解析 |
---|---|
-atime n[smhdw] | 距離文件上次被訪問時的時間間隔 |
-ctime n[smhdw] | 距離文件建立時的時間間隔 |
-delete | 刪除檢索到的文件 |
-depth n | 檢索深度爲 n 的文件,即位於指定目錄如下 n 層的文件 |
-empty | 檢索空文件或空目錄 |
-fstype type | 指定文件所在的文件系統的類型 |
-group gname | 指定文件的屬組 |
-iname pattern | 同 -name ,忽略大小寫 |
-ipath pattern | 同 -path ,忽略大小寫 |
-ls | 打印搜索到的文件的詳細信息 |
-maxdepth n | 指定遞歸的最大層數爲 n |
-mtime n[smhdw] | 距離文件上次發生變動時的時間間隔 |
-name pattern | 搜索時使用 pattern 對文件名進行匹配 |
-path pattern | 搜索時使用 pattern 對文件路徑進行匹配 |
-perm mode | 根據文件權限搜索 |
-size n[ckMGTP] | 根據文件大小搜索 |
-type t | 根據文件類型搜索 |
-user uname | 指定文件的屬主 |
A Guide to the Linux 「Find」 Command
find 命令手冊:man find