03_查詢和檢索

weixin_34041003發表於2017-08-04

find

  • 根據檔名查詢
    find pathname -options [-print -exec -ok -name -type...]
  1. 在目錄中搜尋檔案,path指定目錄路徑,系統從這裡開始沿著目錄樹向下查詢檔案。它是一個路徑列表,相互用空格分離,如果不寫path,那麼預設為當前目錄。Expression 是find命令接受的表示式,find命令的所有操作都是針對表示式的。
  2. 一條最常用的find命令--在當前目錄及子目錄下查詢所有以file開頭的檔名。
$ find . -name 'file*'
$ find \/ -name 'vimrc'
$ find ~ -name '*.c'
$ find /usr/ -name "*tmp*" -exec ls -l { } \;
find ./ -name "*tmp" -ok rm { } \;  
sudo find ./ -size +65M
//搜尋大於65M的檔案
sudo find ./ -size +65M -size -100M -exec ls -lh {} \;
//搜尋大於65M的檔案小於100M的檔案,並按格式顯示

注意:

  1. -exec表示對結果集執行二次命令
  2. *表示萬用字元
  3. ?表示只匹配一個字元
  4. \;固定語法,表示結束符
  5. -type按型別來搜尋

grep

  • 根據內容檢索
    grep [options] PATTERN [FILE...]
  1. 在指定檔案中搜尋特定的內容,並將含有這些內容的行輸出到標準輸出。若不指定檔案
    名,則從標準輸入讀取。
  • [options]部分包含的主要引數:
-I:不區分大小寫(只適用於單字元)。
-h:查詢多檔案時不顯示檔名。
-l:查詢多檔案時只輸出包含匹配字元的檔名。
-n:顯示匹配行及行號。
-s:不顯示不存在或無匹配文字的錯誤資訊。
-v:顯示不包含匹配文字的所有行。
-R: 連同子目錄中所有檔案一起查詢。
  • 比如到系統標頭檔案目錄下查詢所有包含printf的檔案
$ grep 'printf' /usr/include -R  

xargs

  • 從標準輸入建立和執行命令列
    xargs [OPTION] [command]
  1. 它的作用是將引數列表轉換成小塊分段傳遞給其他命令,以避免引數列表過長的問題
  2. 在使用find命令的-exec選項處理匹配到的檔案時,find命令將所有匹配到的檔案一起傳遞給exec執行。但有些系統對能夠傳遞給exec的命令長度有限制,這樣在find命令執行幾分鐘之後,就會出現溢位錯誤。錯誤資訊通常是“引數列太長”或“引數列溢位”。這就是xargs命令的用處所在,特別是與find命令一起使用。
  3. find命令把匹配到的檔案傳遞給xargs命令,而xargs命令每次只獲取一部分檔案而不是全部,不像-exec選項那樣。這樣它可以先處理最先獲取的一部分檔案,然後是下一批,並如此繼續下去。
  4. 查詢系統中的每一個普通檔案,然後使用xargs命令來測試它們分別屬於哪類檔案:
    find . -type f | xargs file
    查詢usr目錄下名字以“tmp”開頭的檔案,將其詳細資訊列出。
//錯誤,結果是當前目錄的ls -l資訊
find /usr -name "tmp*" | ls -l
find /usr -name "tmp*" | xargs ls -l
find /usr -name "tmp*" -print0 | xargs -0 ls -l
  • -print0表示輸出以null分隔(-print使用換行);-0表示輸入以null分隔。查詢當前目錄下,檔名包含“bin”字串的檔案,並在檔案中搜尋“printf”這個詞
find ./ -name "*bin*" | grep "printf"
find ./ -name "*bin*" | xargs grep "printf"
find ./ -name "*bin*" -print0 | xargs -0 grep "printf"  

相關文章