[linux] find指令, 查找檔案 ,內容忽略某個目錄等等

 查找檔案指令如下.

find "{$PATH}" -name "file name" -exec grep -H "{$CONTENT}" {} \;

 

find也可以用 [檔案名稱] 搜尋檔案, 可搭配grep指令使用.
Ex:

find / -name test.xml

以上這段指令, 搜尋整個系統中, 是否有檔名為test.xml的檔案.

Ex:

find ./kernel -name "*.py" -exec grep -H "main" {} \;

以上這段指令, 是要搜尋./kernel底下所有的.py檔, 內容含有"main"的地方.

find的參數:
  -name 要搜尋哪些檔名
  -exec utility name [argument...] {} \;
    搜尋出的檔名 交給哪個執行檔(utility name)處理
    {} 會被find搜尋後的檔名路徑名稱所取代
    \; 代表exec的參數到此為止
       -path [PATH]  ( 目錄, 只吃 " * " 通用符號, " . " 跟 "/" 都當作一般字元 )
       -prune ( 忽略目錄, 接在目錄後方表示前方的目錄要忽略 )
       -o  (Or),  expr1 -o expr2 表示 "如果expr1為真, expr2就不會被執行" ( expr2 is not evaluated if expr1 is true)
       -print ( default option, 會把找到的資料print出來)

#Case: 找 /etc/sysconfig/ 目錄下的資料, 但要忽略目錄 /etc/sysconfig/network-scripts/
$ find /etc/sysconfig -path /etc/sysconfig/network-scripts -prune -o -print
 
#Case: 找 /etc/sysconfig/ 目錄下的檔案, 但要忽略目錄 /etc/sysconfig/network-scripts/
$ find /etc/sysconfig -path /etc/sysconfig/network-scripts -prune -o -type f -print  | wc
 
#Case: 找 /etc/sysconfig/ 目錄下的資料, 但要忽略目錄 /etc/sysconfig/network-scripts/ 及目錄 /etc/sysconfig/cbq , 要用括號.
$ find /etc/sysconfig \( -path /etc/sysconfig/network-scripts -o -path /etc/sysconfig/cbq \) -prune -o -print
 
#Case: 找 /etc/ 目錄下的資料, 但要忽略目錄 /etc/lvm 目錄, 並執行 grep 找出有含 hostname的  file.
$ find /etc -path /etc/lvm -prune -o -type f -exec grep -il [New hostname] {} \;
 
#Case: 找~目錄下的ENGSERV*資料, 但要忽略目錄 .snapshot 目錄
$ find . -path .snapshot -prune -o -name ENGSERV* -print

grep的參數:
  -H 列出搜尋到的檔案名稱路徑