在這一章當中咱們開始講述文件的查找命令,在Linux中,主要圍繞這兩個命令,一個是locate。另外一個是find命令。正則表達式
咱們在Windows中查找某個文件,例如(C,D,E,F)盤其中一個分區或者是整個分區來進行查找,那麼查找以後,符合查找條件的文件會自動顯示出來,這就是文件查找的一個過程,那麼文件查找的大體解釋就是:在文件系統上查找符合條件的文件,並予以顯示。這個和此前學到的grep命令有所區別,grep是用來匹配字符串的,但文件查找是查找該文件的自己,而不是該文件的內容,而對於在Linux中文件查找的實現工具爲:locate和find。只不過這兩個命令實現的機制大相徑庭。數據庫
locate命令是一個模糊匹配的查找命令,只要該路徑中包含查找的字符,都會予以顯示,其查找速度快,性能極佳,只不過並非遍歷整個文件系統來實現的,而是查詢事先構建好的數據庫,這個數據庫並非實時的,等待系統空閒時,是經過某個時刻自動來構建。因此咱們來總結如下該命令的主要特性:ide
locate: 依賴於事先構建好的索引庫;事先若是沒有,經過某個週期性任務; 系統自動實現(週期性任務); 手動更新數據庫(updatedb); 工做特性: 查找速度快; 模糊查找; 非實時查找;
locate命令的格式爲:工具
locate [OPTION]... PATTERN... -b:只匹配路徑中的基名; -c:統計出共有多少個符合條件的文件; -r:BRE 注意:索引構建過程須要遍歷整個根文件系統,極其消耗資源;
locate相對find命令而言,後者更增強大一些,它的執行過程和locate有所不一樣,find命令是直接經過文件系統進行實時查找遍歷,並無那種索引數據庫這樣的一箇中間環節存在,因此並不依賴該數據庫,可是文件系統的路徑不少,文件數量非常龐大,因此咱們能夠在該命令下指定某些條件來縮小查找範圍。但比起locate,性能差一些,畢竟是在文件系統內進行實時性查找,能精確反饋。因此咱們來總結一下該命令的主要特性:性能
find: 實時查找工具,經過遍歷指定其實路徑文件系統層級結構完成文件查找; 工做特性: 查找速度:略慢; 精確查找 實時查找;
find命令的格式爲:測試
find [OPTIONS] [查找的起始路徑] [查找條件] [處理動做]
以上都是可選的,默認爲find命令時,只會在當前路徑下查找,因爲沒有指定查找條件,因此都會符合條件,而處理的動做默認就是標準輸出。ui
查找其實路徑:指定具體搜索目標起始路徑;默認爲當前目錄; 查找條件:指定的查找標準,能夠根據文件名、大小、類型、從屬關係、權限等等標準來進行;默認爲找出指定路徑下的全部文件; 處理動做:對符合查找條件的文件作出的動做,例如刪除等操做;默認爲輸出至標準輸出(屏幕); 默認沒有指定條件時,都會符合顯示;
查找條件也能夠稱做查找標準,是由一個-
和長選項或能夠理解爲完整單詞組成用做測試,符合該條件時進行默認或指定的處理,因此查找條件或查找標準也叫作其表達式,由選項和測試組成。咱們主要講的就是查找條件當中的測試的實現,而測試主要由如下類型組成:
咱們來先說第一個,根據文件名來進行查找的測試條件。spa
根據文件名來查找: -name "pattern" -iname "pattern" 支持glob風格的通配符;不是正則表達式風格; *, ?, [], [^] -regex pattern:基於正則表達式模式查找文件,匹配整個路徑,而非基名;
第二個就是根據其文件從屬關係進行查找,這就表示看一下該文件的屬主屬組是那個用戶。code
根據文件從屬關係查找: -user USERNAME:查找屬主指定的用戶中全部的文件; -group GRPNAME:查找屬組指定組中的全部文件;
若是文件屬主和屬組沒有或被刪除的話,只顯示UID和GID,那咱們也能夠經過屬主屬組的ID進行查找。orm
-uid UID:查找屬主指定的UID文件; -gid GID:查找屬組指定組的全部文件;
反過來,只要ID號沒有屬主屬組的文件,咱們就稱之爲沒有屬主屬組的文件。
-nouser:查找沒有屬主的文件; -nogroup:查找沒有屬主的文件;
那麼第三個是根據文件的類型來進行查找的測試條件。
根據文件的類型查找: -type TYPE: f:普通文件; d:目錄文件; l:符號連接文件; b:塊設備文件; c:字符設備文件; p:管道文件; s:套接字文件;
咱們能夠編輯複雜的條件測試,只要是測試的結果一般爲布爾型,要不爲true要不爲false,因此根據其邏輯的運算模式組合起來,而邏輯運算也無非就是咱們以前所講的與、或、非、異或組合起來,而在此處是講查找的條件鏈接起來。
組合測試: 與:-a, 默認組合邏輯; 或:-o 非:-not, !
咱們繼續說第四個,第四個就是根據文件大小來進行查找,默認是按照字節單位,那麼帶加減號時,並非精確查找,直接默認寫單位的話,它是一個半開半閉區間,至關於就是這個數字減去1而且小於等於該數字的自己,意味着能夠小於這個值,但要小於等於這個單位數字的自己,不能超過該數字。
而-#UNIT,就是小於所指定的文件單位,不能超過文件自己。
而+#UNIT意味着要大於該指定的文件單位,不能小於其文件自己,意味這並不包含該文件。
-size [+|-]#UNIT(單位) 經常使用單位:K, M, G #UNIT:(#-1, #] -#UNIT:[0, #-1] +#UNIT:(#, oo) 注:oo 正無窮
那麼咱們接下來講根據其時間戳查找,這個是很麻煩的一項查找操做,它根據兩類來進行查找,一類是以"天"爲單位,另外一類是以"分鐘"單位。咱們以天爲單位爲例,分爲atime, mtime和ctime,atime爲訪問時間、mtime爲內容修改時間、ctime爲屬性修改時間。並且它們也支持加或減的基本單位,咱們就以atime爲例。
若是爲#,意味着在當前時刻到過去的時間裏,大於等於知足該條件,但不能大於該數字。例如,查找三天前的文件,意味着從如今開始,要大於等於三天,但不能超過四天。
若是爲-#,意味這在當前時刻到過去的時間裏,小於則知足該條件,且不能超過該條件,例如,查找三天之內的文件。
若是爲+#,意味着在當前時刻到過去的時間裏,大於則知足該條件,且超過了該條件的自己,例如,查找三天外的文件。
以"天"爲單位: -atime [+|-]# #:[#,#-1) -#:[#,#-1) +#:(#,oo) -mtime -ctime 以"分鐘"爲單位: -amin -mmin -cmin
那麼接下來根據權限進行查找。
-perm [/|-] mode mode:精確權限匹配; /mode:任何一類用戶(u,g,o)的權限中的任何一位(r,w,x)符合條件即知足;(有一個就能符合) 9位權限之間存在"或"關係;相反,全都沒有; -mode:每一類用戶(u,g,o)的權限中的每一位(r,w,x)同時符合條件即知足;都得必須有 9位權限之間存在着"與"關係;相反,至少有一個沒有;
以上說完查找條件以後,當查找完成以後,咱們能夠對結果進行一個處理的操做,例如除了默認顯示以外,還能夠產出或者保存信息等。那麼經常使用的處理動做以下操做:
處理動做: -print:輸出至標準輸出;默認的執行動做; -ls:相似於對查找的文件執行"ls -l"命令,輸出文件的詳細信息; -delete:刪除查找到的文件; -fls /PATH/TO/SOMEFILE:把查找到的文件上長格式信息保存至指定文件中; -ok COMMAND {} \; :對查找到的每一個文件執行由COMMAND表示的命令;每次操做都由用戶進行確認; -exec COMMAND {} \; :對查找到的每一個文件執行由COMMAND表示的命令; {}:引用查找到的文件名;
例如:
# find ./ -nouser -a -nogroup -ok chown root:root {} \; # find ./ -nouser -a -nogroup -exec chown root:root {} \; # find ./ -user -perm /002 -exec mv {} {}.tmp \;
須要注意的是,find查找到的文件量是很是大的,find傳遞查找到的文件路徑至後面的命令時,是先查找出全部符合條件的文件路徑,並一次性傳遞給後面的命令;可是有些命令不能接受過長的參數,此時命令執行會失敗;另外一種方式可規避此問題。
# find | xargs COMMAND