1. 程式人生 > >2018-1-9Linux基礎知識(20)文件查找命令

2018-1-9Linux基礎知識(20)文件查找命令

大致 -m 復雜 文件查找命令 rep options 表示 文件系統 nor

在這一章當中我們開始講述文件的查找命令,在Linux中,主要圍繞這兩個命令,一個是locate。另一個是find命令。

一、文件查找

我們在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)文件查找命令