2018-1-9Linux基礎知識(20)文件查找命令
一、文件查找
我們在Windows中查找某個文件,例如(C,D,E,F)盤其中一個分區或者是整個分區來進行查找,那麽查找之後,符合查找條件的文件會自動顯示出來,這就是文件查找的一個過程,那麽文件查找的大致解釋就是:在文件系統上查找符合條件的文件,並予以顯示。這個和此前學到的grep命令有所區別,grep是用來匹配字符串的,但文件查找是查找該文件的本身,而不是該文件的內容,而對於在Linux中文件查找的實現工具為:locate和find。只不過這兩個命令實現的機制截然不同。
二、locate命令
locate命令是一個模糊匹配的查找命令,只要該路徑中包含查找的字符,都會予以顯示,其查找速度快,性能極佳,只不過並不是遍歷整個文件系統來實現的,而是查詢事先構建好的數據庫,這個數據庫並不是實時的,等待系統空閑時,是通過某個時刻自動來構建。所以我們來總結以下該命令的主要特性:
locate: 依賴於事先構建好的索引庫;事先如果沒有,通過某個周期性任務; 系統自動實現(周期性任務); 手動更新數據庫(updatedb); 工作特性: 查找速度快; 模糊查找; 非實時查找;
locate命令的格式為:
locate [OPTION]... PATTERN... -b:只匹配路徑中的基名; -c:統計出共有多少個符合條件的文件; -r:BRE 註意:索引構建過程需要遍歷整個根文件系統,極其消耗資源;
三、find命令
locate相對find命令而言,後者更加強大一些,它的執行過程和locate有所不同,find命令是直接通過文件系統進行實時查找遍歷,並沒有那種索引數據庫這樣的一個中間環節存在,所以並不依賴該數據庫,但是文件系統的路徑很多,文件數量很是龐大,所以我們可以在該命令下指定某些條件來縮小查找範圍。但比起locate,性能差一些,畢竟是在文件系統內進行實時性查找,能精確反饋。所以我們來總結一下該命令的主要特性:
find: 實時查找工具,通過遍歷指定其實路徑文件系統層級結構完成文件查找; 工作特性: 查找速度:略慢; 精確查找 實時查找;
find命令的格式為:
find [OPTIONS] [查找的起始路徑] [查找條件] [處理動作]
以上都是可選的,默認為find命令時,只會在當前路徑下查找,由於沒有指定查找條件,所以都會符合條件,而處理的動作默認就是標準輸出。
查找其實路徑:指定具體搜索目標起始路徑;默認為當前目錄; 查找條件:指定的查找標準,可以根據文件名、大小、類型、從屬關系、權限等等標準來進行;默認為找出指定路徑下的所有文件; 處理動作:對符合查找條件的文件做出的動作,例如刪除等操作;默認為輸出至標準輸出(屏幕); 默認沒有指定條件時,都會符合顯示;
3.1 查找條件
查找條件也可以稱作查找標準,是由一個-
和長選項或可以理解為完整單詞組成用作測試,符合該條件時進行默認或指定的處理,所以查找條件或查找標準也叫做其表達式,由選項和測試組成。我們主要講的就是查找條件當中的測試的實現,而測試主要由以下類型組成:
我們來先說第一個,根據文件名來進行查找的測試條件。
根據文件名來查找: -name "pattern" -iname "pattern" 支持glob風格的通配符;不是正則表達式風格; *, ?, [], [^] -regex pattern:基於正則表達式模式查找文件,匹配整個路徑,而非基名;
第二個就是根據其文件從屬關系進行查找,這就表示看一下該文件的屬主屬組是那個用戶。
根據文件從屬關系查找: -user USERNAME:查找屬主指定的用戶中所有的文件; -group GRPNAME:查找屬組指定組中的所有文件;
如果文件屬主和屬組沒有或被刪除的話,只顯示UID和GID,那我們也可以通過屬主屬組的ID進行查找。
-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位權限之間存在著"與"關系;相反,至少有一個沒有;
3.2 處理動作
以上說完查找條件之後,當查找完成之後,我們可以對結果進行一個處理的操作,例如除了默認顯示之外,還可以產出或者保存信息等。那麽常用的處理動作如下操作:
處理動作: -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
2018-1-9Linux基礎知識(20)文件查找命令