Linux find命令
Linux上的find命令是findutil軟件包的一部分, 一般已經(jīng)默認(rèn)集成在了幾乎所有的發(fā)行版中
find命令有非常大的靈活性,可以向其指定豐富的搜索條件(如文件權(quán)限, 屬主, 屬組,文件類(lèi)型,日期和大小等)來(lái)定位系統(tǒng)中的文件和目錄
此外,find還支持對(duì)搜索到的結(jié)果進(jìn)行多種類(lèi)型的命令操作
一. find命令的基本結(jié)構(gòu)如下:
find [paths] [expression] [actions]
find命令接受一個(gè)或多個(gè)路徑(paths)作為搜索范圍,并在該路徑下遞歸的搜索,即搜索完指定的目錄后,還會(huì)對(duì)該目錄下的子目錄進(jìn)行檢索,以及子目錄下的子目錄,直到達(dá)到目錄樹(shù)底部
默認(rèn)情況如果不帶任何搜索條件,find命令會(huì)返回指定目錄下的所有文件,所以常常需要通過(guò)特定的expression對(duì)結(jié)果進(jìn)行篩選
find命令默認(rèn)的action是將所有檢索結(jié)果打印至標(biāo)準(zhǔn)輸出,可以自定義action,讓find命令對(duì)搜索到的結(jié)果執(zhí)行特定的操作
首先查看示例目錄(Desktop)
默認(rèn)find命令會(huì)列出改目錄下的所有文件
為find命令指定expression以篩選出特定的文件
為find命令指定特殊的action(此處 -delete表示刪除搜索結(jié)果)
二. 搜索條件(expression)
1. 根據(jù)文件檢索
find命令中 -name選項(xiàng)可以根據(jù)文件名稱進(jìn)行檢索(區(qū)分大小寫(xiě)), 如需要忽略文件名中的大小寫(xiě), 可以使用 -iname選項(xiàng)
-name和-iname兩個(gè)選項(xiàng)都支持wildcards, 如:
?可以表示任意一個(gè)單一的符號(hào)
*可以表示任意數(shù)量(包括0)的符號(hào)
find /usr -name '*.txt'
find /usr -name ???? (查找/usr目錄下所有的文件名剛好為4個(gè)字符的文件)
有些時(shí)候,你需要在搜索時(shí)匹配某個(gè)文件或目錄的完整路徑,而不僅僅是匹配文件名,可以使用-path或者-ipath選項(xiàng), 如下所示:
2. 根據(jù)文件類(lèi)型檢索
如果只想搜索得到文件或者目錄,即不想它們同時(shí)出現(xiàn)在結(jié)果中,可以使用-type選項(xiàng)指定文件類(lèi)型
-type選項(xiàng)最常用的參數(shù)如下:
f: 文件
d: 目錄
l: 符號(hào)鏈接
3. 檢索空文件
find命令支持 -empty選項(xiàng)用來(lái)檢索為空的文件或目錄。空文件即文件里沒(méi)有任何內(nèi)容,空目錄即目錄中沒(méi)有任何文件或子目錄
find / -type d -empty
4. 反義匹配
find命令也允許用戶對(duì)當(dāng)前的匹配條件進(jìn)行"反義"(類(lèi)似于邏輯非操作)
如需要檢索 /usr下所有文件名不以.txt為后綴的文件,可以使用以下命令
find /usr -type f ! -name '*.txt'
也可以翻轉(zhuǎn)任何其他的篩選條件, 如:
find /usr -type f ! -empty
5. 根據(jù)文件的所屬權(quán)檢索
為了檢索歸屬于特定用戶的文件或者目錄,可以使用-user選項(xiàng)
find / -type f -user root
-group選項(xiàng)則可以根據(jù)文件或目錄屬組進(jìn)行檢索
6. 根據(jù)時(shí)間日期進(jìn)行檢索
根據(jù)文件創(chuàng)建或者修改的時(shí)間進(jìn)行檢索
Linux系統(tǒng)中,與文件相關(guān)聯(lián)的時(shí)間參數(shù)有以下三種:
修改時(shí)間: 最后一次文件內(nèi)容有過(guò)更改的時(shí)間點(diǎn)
訪問(wèn)時(shí)間: 最后一次文件有被讀取過(guò)的時(shí)間點(diǎn)
變更時(shí)間: 最后一次文件有被變更過(guò)的時(shí)間點(diǎn)(如內(nèi)容被修改,或權(quán)限等被修改)
對(duì)應(yīng)的是find命令中的-mtime, -atime, -ctime(cmin等)
該三個(gè)選項(xiàng)的使用準(zhǔn)尋以下示例中的規(guī)則
-mtime 3: 該文件3天前被修改過(guò)
-mtime -3: 該文件3天以內(nèi)被修改過(guò)
-mtime +3: 該文件距離上次修改已經(jīng)超過(guò)3天時(shí)間
find /usr -type f -mtime 3 檢索/usr下兩天前被修改過(guò)的文件
如果覺(jué)得-mtime等選項(xiàng)以天為單位時(shí)間有點(diǎn)長(zhǎng),還可以使用-mmin, -amin, -cmin三個(gè)選項(xiàng):
find /usr -type f -mtime +50 -mtime -100 檢索/usr下50到100天之前被修改過(guò)的文件
find /usr -type f -mtime 2 檢索/usr下兩天前被修改且5分鐘前又讀取過(guò)的文件
7. 根據(jù)文件大小檢索
-size 選項(xiàng)允許用戶通過(guò)文件大小進(jìn)行檢索(只適用于文件,目錄沒(méi)有大小...)
表示文件大小的單位由以下字符組成
c: 字節(jié)
k: Kb
M: Mb
G: Gb
另外,還可以使用+或者-符號(hào)表示大于或者小于當(dāng)前條件
find / -size +1G 檢索文件高于1GB的文件
8. 根據(jù)文件權(quán)限檢索
find命令可以使用 -perm選項(xiàng)以文件權(quán)限為依據(jù)進(jìn)行搜索
使用符號(hào)形式
如需要檢索/usr/目錄下權(quán)限為rwxr-xr-x的文件, 可以使用以下命令
find /usr -perm u=rwx, g=rx, o=rx
搜索/usr目錄下所有權(quán)限為r-xr-xr-x(即系統(tǒng)中的所有用戶都只有讀寫(xiě)權(quán)限)的文件和目錄,可以使用如下命令
find /usr -perm a=rx
很多時(shí)候,我們只想匹配文件權(quán)限的子集.比如,檢索可以直接被任何用戶執(zhí)行的文件,即只關(guān)心文件的執(zhí)行權(quán)限,而不用管其讀寫(xiě)權(quán)限是什么
其中的a=x前面的/符號(hào)即用來(lái)表示只匹配權(quán)限的某個(gè)子集(執(zhí)行權(quán)限), 而不用其他權(quán)限的具體設(shè)置
使用數(shù)字形式
-perm選項(xiàng)也支持?jǐn)?shù)字形式的文件權(quán)限標(biāo)記
find /usr -perm 644搜索 /usr 目錄下權(quán)限644(即rwxr-xr-x)的文件
9. 限制遍歷的層數(shù)
find命令默認(rèn)是以遞歸的方式檢索項(xiàng)目的,這有時(shí)候會(huì)導(dǎo)致得到的結(jié)果數(shù)量非常巨大。可以使用-maxdepth限制find命令遞歸的層數(shù)
find / -maxdepth 3 搜索時(shí)向下遞歸的層數(shù)最大為3
10. 邏輯組合
在之前的例子中出現(xiàn)多個(gè)搜索條件的組合以及對(duì)某個(gè)搜索條件的反轉(zhuǎn)
實(shí)際上find命令支持 and 和 or兩種邏輯運(yùn)算,對(duì)應(yīng)的命令選項(xiàng)分別是-a和-o, 通過(guò)這兩個(gè)選項(xiàng)可以對(duì)搜索條件進(jìn)行更復(fù)雜的組合
此外還可以使用小括號(hào)對(duì)搜索條件進(jìn)行分組,注意find命令中的小括號(hào)常需要用單引號(hào)包裹起來(lái)。因小括號(hào)在shell中有特殊的含義
如檢索/usr 下文件名以python開(kāi)頭且類(lèi)型為目錄的文件
find /usr -type d -name 'python*'
該命令等同于:
find /usr -type d -a -name 'python*'
更復(fù)雜的組合形式如:
find / '(' -mmin -5 -o -mtime +50 ')' -a -type f
三. 對(duì)搜索結(jié)果執(zhí)行命令
1. 刪除文件
-delete選項(xiàng)可以用來(lái)刪除搜索到的文件和目錄
如刪除home目錄下所有的空目錄
find ` -type d -empty -delete
2. 執(zhí)行自定義命令
-exec選項(xiàng)可以對(duì)搜索到的結(jié)果執(zhí)行特定的命令
如需要將home目錄下所有的mp3音頻文件復(fù)制到移動(dòng)存儲(chǔ)設(shè)備(假設(shè)路徑是/media/Mydrive), 可以使下面的命令
find / -type f -name '*.mp3' -exec cp {} /media/Mydrive ';'
其中的大括號(hào){}作為檢索到的文件的占位符,而分號(hào);作為命令結(jié)束的標(biāo)志。因?yàn)榉痔?hào)是shell中有特殊含義的符號(hào),所以需要使用單引號(hào)括起來(lái)
每當(dāng)find命令檢索到一個(gè)符合條件的文件,會(huì)使用其完整路徑取代命令中的{}, 然后執(zhí)行-exec 后面的命令一次
另一個(gè)很重要的用法是,在多個(gè)文件中檢索某個(gè)指定的字符串
如在用戶主目錄下的所有文件中檢索字符串hello, 可以使用如下命令
find / -type f -exec grep -l hello {} ';'
-exec 選項(xiàng)中的+符號(hào)
創(chuàng)建Gzip格式的壓縮文件的命令為: tar -czvf filename.tar <list of files>
現(xiàn)在假設(shè)需要將用戶主目錄下所有的MP3文件添加到壓縮包music.tar.gz中, 直觀的感覺(jué)是:
find / -type f -name '*.mp3' -exec tar -czvf music.tar.gz {} ';'
實(shí)際情況是,這樣得到的music.tar.gz其中只包含一個(gè)MP3文件
原因是find命令每次發(fā)現(xiàn)一個(gè)音頻文件,都會(huì)在執(zhí)行一次-exec選項(xiàng)后面的壓縮命令。導(dǎo)致先前生成的壓縮包被覆蓋
可以先讓find命令檢索出所有符合條件的音頻文件,在將得到的文件列表傳遞給后面的壓縮命令。完整的命令如下:
find / -type f -name '*.mp3' -exec tar -czvf music.tar.gz {} +
顯示文件信息
如果想瀏覽到的文件(目錄)的詳細(xì)信息(如權(quán)限和大小等), 可以直接使用 -ls選項(xiàng)
四.常用參數(shù)匯總
-atime n[smhdw] 距離文件上次被訪問(wèn)時(shí)的時(shí)間間隔
-ctime n[smhdw] 距離文件創(chuàng)建時(shí)的時(shí)間間隔
-delete 刪除檢索到的文件
-depth n 檢索深度為 n 的文件,即位于指定目錄以下 n 層的文件
-empty 檢索空文件或空目錄
-fstype type 指定文件所在的文件系統(tǒng)的類(lèi)型
-group gname 指定文件的屬組
-iname pattern 同 -name,忽略大小寫(xiě)
-ipath pattern 同 -path,忽略大小寫(xiě)
-ls 打印搜索到的文件的詳細(xì)信息
-maxdepth n 指定遞歸的最大層數(shù)為 n
-mtime n[smhdw] 距離文件上次發(fā)生變更時(shí)的時(shí)間間隔
-name pattern 搜索時(shí)使用 pattern 對(duì)文件名進(jìn)行匹配
-path pattern 搜索時(shí)使用 pattern 對(duì)文件路徑進(jìn)行匹配
-perm mode 根據(jù)文件權(quán)限搜索
-size n[ckMGTP] 根據(jù)文件大小搜索
-type t 根據(jù)文件類(lèi)型搜索
-user uname 指定文件的屬主
總結(jié)
以上是生活随笔為你收集整理的Linux find命令的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 正交矩阵、EVD、SVD
- 下一篇: 关于在Arduino下STM32编程——