文件查找是根據文件的各種屬性去找到相對應的文件。
文件查找分為實時查找和非實時查找。
非實時查找是根據索引來進行查找;雖然非實時查找查詢速度快,但在構建索引時相當占用資源,只有在系統空閑時才能進行,這樣有可能會造成索引內容與當前系統中文件的狀態不一致的情況,所以查找結果有可能會不準確。
locate屬于非實時查找命令,此命令進行模糊查找,所以查找結果并不一定與期望結果一致,如下圖:
查詢文件名為man5的文件,結果包括重復的目錄名man5。
可以使用update命令來手動更新索引內容。
實時查找要遍歷所有文件進行條件匹配,所以速度會比較慢,但查找結果精確。
find命令為實時查找命令,下面主要來介紹find的用法。
find使用方法:
find命令會遍歷指定目錄中的所有文件來完成查找。
格式:
find [option]…[查找路徑][查找條件][處理動作]
查找路徑:默認為當前目錄
查找條件:默認為指定路徑下的所有文件
處理動作:默認為顯示至屏幕
查找條件:
–name ‘FILENAME’:文件名作精確匹配,支持使用通配符。
*:任意長度的任意字符
?:任意單個字符
[]:指定范圍內的任意單個字符
[^]:不包含指定范圍內的任意字符
-iname ‘FILENAME’:文件名匹配時忽略大小寫
-regex pattern:基于正則表達式進行文件名匹配。
正則表達式要求必須全路徑匹配,如下圖第一個查找只給出了文件名,沒有找到結果;第二個查找給出了完整的查找路徑才顯示出了結果。
如果是多路徑查找可以在路徑處做匹配即可,如下圖:
-iregex:正則表達式匹配的結果中忽略大小寫
-user USERNAME:根據屬主查找
-group GROUPNAME:根據屬組查找
-uid UID:根據UID查找
-gid GID:根據GID查找
-nouser:查找沒有屬主的用戶
將rrt用戶刪除后,宿主目錄下的屬于rrt的文件都變成了無屬主文件
-nogroup:查找沒有屬組的用戶
-type:根據文件類型查找
f:普通文件
d:目錄
c:字符文件
b:塊設備
s:套接字文件
p:命名管道
-size [+|-]#UNIT:根據文件大小查找,默認為字節
常用單位:K,M,G
因為bash不支持浮點數,所以帶有小數的文件大小會自動進位,如果查找大小為3k的文件,那么大小范圍為2k-3k之間的文件都會顯示出來,而小于3k的文件范圍為小于等于2k.
#UNIT:#-1 < x <=#
-#UNIT:x<=#-1
+#UNIT:x>#
上例中查找的結果中文件大小都在9k-10k之間
上例中查找結果都是大于10k的目錄
上例中的結果都是小于9k的文件。
組合條件
-a:與
-o:或
-not:非
上例中查找/home下屬于用戶rot的目錄
兩個條件沒有指定邏輯關系時,默認使用“與”
-not A -a -not B = -not(A -o B)
-not A -o -not B = -not(A -a B)
例如: -not \(iname “*r*” -o -user ben \) 表示文件名中不包含r且忽略大小寫,并且屬主不是ben的文件
根據時間戳查找:
以“天”為單位:
-mtime:文件內容修改時間
-ctime:元數據改變時間
-atime:訪問時間
[+|-] #
-atime +5:代表最后一次訪問時間大于等于6天前
-atime 5:代表最后一次訪問時間在5-6那一天
-atime -5:代表最后一次訪問時間小于等于5天內
例如:當前有四個文件分別為a,b,c,d,最后訪問時間如下所示:
a 2015-03-17 02:51:37
b 2015-03-15 15:00:00
c 2015-03-10 15:00:00
d 2015-03-13 15:00:00
假如文件a的時間為當前時間,則其它三個文件的時間與a文件相差的天數分別為:b,2天,c,7天,d,4天
上例中當atime=1時所查找的區間為1-2天之間的文件,結果為文件b;atime=-1時查找1天以的文件,結果為文件a;atime=+1時查找大于2天的文件,結果為文件c和文件d。
下圖分別查找2天和3天的不同情況,可以結合上面的圖示時間表來進行分析
以“分鐘”為單位
-mmin
-cmin
-amin
用法上面的情況相同,不再詳細說明。
根據權限查找
-perm [/|+|-] MODE 根據權限查找
mode:精確匹配
/mode|+mode:只要有一位匹配即可
-mode:必須包含整個mode才能顯示
例如:目前當前目錄中的文件的權限如下圖所示
查找權限為640的文件
查找權限為包含640中任意一位的文件
查找權限中至少包含640的文件
處理動作:
-print:默認處理動作,顯示
-ls:類似ls -l的形式顯示每一個文件的詳細信息
-ok COMMAND {} \;:每一次操作都需要確認
-exec COMMAND {} \;:執行命令時不需要確認
find一次查找符合條件的所有文件,并一同傳遞給-ok或-exec后面的命令,但有些命令不能接受過長的參數,此時可以采用下面這種方式來解決:
find | xargs COMMAND 此方式可以逐行處理數據
原創文章,作者:petmaster,如若轉載,請注明出處:http://www.www58058.com/1081
文章代碼多使用編輯器會使文章整體更專業美關,另: 請標簽的添加會使文章的SEO成功率大大提高,
@stanley:好的,謝謝!
以后會注意優化
mark