RSS   



  可打印版本 | 推薦給朋友 | 訂閱主題 | 收藏主題 | 純文字版  


 


 
主題: [教學]如何在 Unix 下面,遞迴搜尋一個子目錄所有檔案當中有無特定字串   字型大小:||| 
eric_superman
銅驢友〔高級〕
等級: 10等級: 10等級: 10


今日心情

 . 積分: 174
 . 文章: 137
 . 收花: 1523 支
 . 送花: 2678 支
 . 比例: 1.76
 . 在線: 2315 小時
 . 瀏覽: 13800 頁
 . 註冊: 7129
 . 失蹤: 118
 . TWed2k-DVD幫分流組
#1 : 2006-6-11 10:35 PM     只看本作者 引言回覆

版主 MU : 感謝您無私的分享

評分:+2   
在 Windows 下的UltraEdit ,有一個功能 "Find in Files" ,配合 Search Sub Directories 選項打開時,
可遞迴搜尋一個子目錄所有檔案當中有無特定字串,這在許多場合都很有用,
那在 Unix 時,如何搜尋呢,很多人直接想到 grep ,
可惜的是,grep無法遞迴搜尋一個子目錄下的所有檔案,grep 一次只能搜尋一個目錄的一層。
例如  /usr/include 下,通常還有 /usr/include/sys, /usr/include/netinet ,
想要找個  IPPROTO_IPV6 出現在那個 header file ,
用 grep 得試許多個子目錄。

這個時候,就要結合 find 。   find 專門用來找特定檔名的,找到後,要印,要呼叫另一個程式,都可以,

cd /usr/include
find . -name "*.h" -exec grep IPPROTO_IPV6 {} \; -print

以上的find 的參數分四大區:
1)    .    一個點,代表 current directory。
2)   -name "*.h"     -name 是用來指定檔名的條件。加了雙引號是怕 shell 把 *.h 都展開了,那 find 就會錯掉。
3)   -exec grep IPPROTO_IPV6 {} \;      -exec 是執行外部程式,grep IPPROTO_IPV6 大家都很熟, {} 則是 find
       的特殊符號,任何檔名都會代入此處,然後呼叫 grep。     \; 則是另一個 find 的特殊符號 ,代表 -exec 的結束。
4)   -print  ,印出檔名。


輸出結果如下:
  IPPROTO_IPV6   = 41,          /* IPv6-in-IPv4 tunnelling              */
./linux/in.h

    IPPROTO_IPV6 = 41,     /* IPv6 header.  */
#define IPPROTO_IPV6            IPPROTO_IPV6
./netinet/in.h


藍色部分是  find  的 -print 所印出的檔名。
其他的就是 grep 的輸出結果,
兩種輸出是交錯的。

覺得有幫到您的忙的話,就請賞點花吧!

[eric_superman 在  2006-6-13 12:16 AM 作了最後編輯]



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
alexanita
銅驢友〔初級〕
等級: 8等級: 8


 . 積分: 118
 . 文章: 307
 . 收花: 823 支
 . 送花: 1003 支
 . 比例: 1.22
 . 在線: 2303 小時
 . 瀏覽: 1060 頁
 . 註冊: 8198
 . 失蹤: 152
 . TWed2k-DVD幫BT組
#2 : 2006-6-12 11:24 AM     只看本作者 引言回覆

以你的例子也可以執行
find /usr/include -name "*.h" -exec grep IPPROTO_IPV6 {} \; -print

find 的功能很強大,接個exec後就可以做很多事情了!



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
LSO
驢手小試
等級: 2


 . 積分: 6
 . 文章: 25
 . 收花: 20 支
 . 送花: 12 支
 . 比例: 0.6
 . 在線: 103 小時
 . 瀏覽: 2270 頁
 . 註冊: 7189
 . 失蹤: 781
#3 : 2006-7-12 11:17 PM     只看本作者 引言回覆

我請問一下
grep -r 是否是另一種方式



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
eric_superman
銅驢友〔高級〕
等級: 10等級: 10等級: 10


今日心情

 . 積分: 174
 . 文章: 137
 . 收花: 1523 支
 . 送花: 2678 支
 . 比例: 1.76
 . 在線: 2315 小時
 . 瀏覽: 13800 頁
 . 註冊: 7129
 . 失蹤: 118
 . TWed2k-DVD幫分流組
#4 : 2006-7-13 12:35 AM     只看本作者 引言回覆

唉...我真是老了,
grep 進步到內建 recursive 都不知道!
我學Unix時的 grep ,是沒有 -r 參數的......

Anyway, 當某些功能無內建 recursive 時, find 還是派的上用場....
感謝 LSO 的指正!



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
Efain
銅驢友〔高級〕
等級: 10等級: 10等級: 10
不可逆人生

今日心情

 . 積分: 174
 . 文章: 1060
 . 收花: 747 支
 . 送花: 517 支
 . 比例: 0.69
 . 在線: 674 小時
 . 瀏覽: 3270 頁
 . 註冊: 8048
 . 失蹤: 416
 . TWed2k-DVD幫
#5 : 2006-7-26 10:35 PM     只看本作者 引言回覆

find + -exec是常見的指令...說真的,還滿好用的...


[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
innova
銀驢友〔高級〕
等級: 14等級: 14等級: 14等級: 14


十週年紀念徽章(五級)  

今日心情

 . 積分: 916
 . 文章: 2714
 . 收花: 7188 支
 . 送花: 1461 支
 . 比例: 0.2
 . 在線: 2182 小時
 . 瀏覽: 15202 頁
 . 註冊: 7173
 . 失蹤: 26
 . 火星
#6 : 2006-7-27 03:52 AM     只看本作者 引言回覆

新版 grep 有 -r 可以找子目錄下的檔案
舊版 grep 有 -l 列出檔名!

so...

新版:  grep -r -l "KeyWord" Dirs

舊版:  find . -name "*.h" -exec grep -l "KeyWord" {} \;



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  訪問主頁  發私人訊息  Blog  快速回覆 新增/修改 爬文標記

   

快速回覆
表情符號

更多 Smilies

字型大小 : |||      [完成後可按 Ctrl+Enter 發佈]        

溫馨提示:本區開放遊客瀏覽。
選項:
關閉 URL 識別    關閉 表情符號    關閉 Discuz! 代碼    使用個人簽名    接收新回覆信件通知
發表時自動複製內容   [立即複製] (IE only)


 



所在時區為 GMT+8, 現在時間是 2024-11-22 12:57 AM
清除 Cookies - 連絡我們 - TWed2k © 2001-2046 - 純文字版 - 說明
Discuz! 0.1 | Processed in 0.021329 second(s), 7 queries , Qzip disabled