Linux find命令
Linux上的find命令是findutil軟件包的一部分, 一般已經默認集成在了幾乎所有的發行版中
find命令有非常大的靈活性,可以向其指定豐富的搜索條件(如文件權限, 屬主, 屬組,文件類型,日期和大小等)來定位系統中的文件和目錄
此外,find還支持對搜索到的結果進行多種類型的命令操作
一. find命令的基本結構如下:
find [paths] [expression] [actions]
find命令接受一個或多個路徑(paths)作為搜索范圍,并在該路徑下遞歸的搜索,即搜索完指定的目錄后,還會對該目錄下的子目錄進行檢索,以及子目錄下的子目錄,直到達到目錄樹底部
默認情況如果不帶任何搜索條件,find命令會返回指定目錄下的所有文件,所以常常需要通過特定的expression對結果進行篩選
find命令默認的action是將所有檢索結果打印至標準輸出,可以自定義action,讓find命令對搜索到的結果執行特定的操作
首先查看示例目錄(Desktop)
默認find命令會列出改目錄下的所有文件
為find命令指定expression以篩選出特定的文件
為find命令指定特殊的action(此處 -delete表示刪除搜索結果)
二. 搜索條件(expression)
1. 根據文件檢索
find命令中 -name選項可以根據文件名稱進行檢索(區分大小寫), 如需要忽略文件名中的大小寫, 可以使用 -iname選項
-name和-iname兩個選項都支持wildcards, 如:
?可以表示任意一個單一的符號
*可以表示任意數量(包括0)的符號
find /usr -name '*.txt'
find /usr -name ???? (查找/usr目錄下所有的文件名剛好為4個字符的文件)
有些時候,你需要在搜索時匹配某個文件或目錄的完整路徑,而不僅僅是匹配文件名,可以使用-path或者-ipath選項, 如下所示:
2. 根據文件類型檢索
如果只想搜索得到文件或者目錄,即不想它們同時出現在結果中,可以使用-type選項指定文件類型
-type選項最常用的參數如下:
f: 文件
d: 目錄
l: 符號鏈接
3. 檢索空文件
find命令支持 -empty選項用來檢索為空的文件或目錄。空文件即文件里沒有任何內容,空目錄即目錄中沒有任何文件或子目錄
find / -type d -empty
4. 反義匹配
find命令也允許用戶對當前的匹配條件進行"反義"(類似于邏輯非操作)
如需要檢索 /usr下所有文件名不以.txt為后綴的文件,可以使用以下命令
find /usr -type f ! -name '*.txt'
也可以翻轉任何其他的篩選條件, 如:
find /usr -type f ! -empty
5. 根據文件的所屬權檢索
為了檢索歸屬于特定用戶的文件或者目錄,可以使用-user選項
find / -type f -user root
-group選項則可以根據文件或目錄屬組進行檢索
6. 根據時間日期進行檢索
根據文件創建或者修改的時間進行檢索
Linux系統中,與文件相關聯的時間參數有以下三種:
修改時間: 最后一次文件內容有過更改的時間點
訪問時間: 最后一次文件有被讀取過的時間點
變更時間: 最后一次文件有被變更過的時間點(如內容被修改,或權限等被修改)
對應的是find命令中的-mtime, -atime, -ctime(cmin等)
該三個選項的使用準尋以下示例中的規則
-mtime 3: 該文件3天前被修改過
-mtime -3: 該文件3天以內被修改過
-mtime +3: 該文件距離上次修改已經超過3天時間
find /usr -type f -mtime 3 檢索/usr下兩天前被修改過的文件
如果覺得-mtime等選項以天為單位時間有點長,還可以使用-mmin, -amin, -cmin三個選項:
find /usr -type f -mtime +50 -mtime -100 檢索/usr下50到100天之前被修改過的文件
find /usr -type f -mtime 2 檢索/usr下兩天前被修改且5分鐘前又讀取過的文件
7. 根據文件大小檢索
-size 選項允許用戶通過文件大小進行檢索(只適用于文件,目錄沒有大小...)
表示文件大小的單位由以下字符組成
c: 字節
k: Kb
M: Mb
G: Gb
另外,還可以使用+或者-符號表示大于或者小于當前條件
find / -size +1G 檢索文件高于1GB的文件
8. 根據文件權限檢索
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
很多時候,我們只想匹配文件權限的子集.比如,檢索可以直接被任何用戶執行的文件,即只關心文件的執行權限,而不用管其讀寫權限是什么
其中的a=x前面的/符號即用來表示只匹配權限的某個子集(執行權限), 而不用其他權限的具體設置
使用數字形式
-perm選項也支持數字形式的文件權限標記
find /usr -perm 644搜索 /usr 目錄下權限644(即rwxr-xr-x)的文件
9. 限制遍歷的層數
find命令默認是以遞歸的方式檢索項目的,這有時候會導致得到的結果數量非常巨大。可以使用-maxdepth限制find命令遞歸的層數
find / -maxdepth 3 搜索時向下遞歸的層數最大為3
10. 邏輯組合
在之前的例子中出現多個搜索條件的組合以及對某個搜索條件的反轉
實際上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
三. 對搜索結果執行命令
1. 刪除文件
-delete選項可以用來刪除搜索到的文件和目錄
如刪除home目錄下所有的空目錄
find ` -type d -empty -delete
2. 執行自定義命令
-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 {} ';'
-exec 選項中的+符號
創建Gzip格式的壓縮文件的命令為: tar -czvf filename.tar <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選項
四.常用參數匯總
-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 指定文件的屬主
總結
以上是生活随笔為你收集整理的Linux find命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 正交矩阵、EVD、SVD
- 下一篇: 关于在Arduino下STM32编程——