參考:
http://winterth.duapp.com/notes/ar03s04.html
http://blog.sina.com.cn/s/blog_7169c8ce0100qkyf.html
--exclude=FILE_PATTERN skip files and directories matching FILE_PATTERN
--exclude-from=FILE skip files matching any file pattern from FILE
--exclude-dir=PATTERN directories that match PATTERN will be skipped.
雖然help中說“--exclude”可以忽略文件和目錄,可是實際測試中發現並不能忽略目錄。所以,要排除目錄,還得用“--exclude-dir”
例如:
grep -rn --exclude-dir=build_* --exclude-dir=kernel --exclude-dir=drivers --exclude=*.out 'abcdefg' .
grep --exclude-dir=".svn" U_BOOT_CMD * -nR --exclude="cscope.out" --exclude="tags"
在當前目錄下查找所有“abcdefg”的字符串,但不在以“build_”開頭的目錄、“kernel”和“dirvers”中查找,同時忽略所有以“out”為后綴的文件。
grep簡介(熟悉的同學可以直接省略這一部分):
全稱是global search regular expression_r(RE) and print out the line,即全文搜索正則表達式,並把匹配的結果打印出來,是linux下非常強大的文本搜索工具。
因為是命令行工具,它可以靈活地指定匹配模式、選項和要匹配的目標文件,如果結合linux下特有的管道命令" | ",其功能要比windows自帶的搜索工具和一些windows下文本編輯器強大很多。
由於工作要求在linux環境下進行C++開發,接觸linux時間尚淺,沒有遇到一款功能較為齊全且較為順手的IDE,因此查看源代碼時很多功能需要手動在bash下完成,比如常常需要查看一個函數在整個源碼庫中的調用情況:
grep -r 'function_name' *
(*表示當前目錄下所有文件,-r表示遞歸查找,使用的模式較為簡單,僅作參考)
由於現在的很多項目都使用subversion作為版本管理工具,因此每個源碼目錄下都會有一個.svn 目錄,其中包含了很多源碼信息。不出意外,你很快會得到滿屏幕的打印信息,但是其中大部分的信息都來自於 .svn 目錄下的文件。
有如下兩種選擇可以去除來自 .svn 目錄的結果信息:
1.使用管道進行雙層“過濾”,其中第二次grep使用了-v選項,即逆向匹配,打印出不匹配的行
grep -r 'function_name' * | grep -v '.svn'
2.或者更簡單一些,直接使用--exclude-dir選項,即指定排除目錄,注意svn前的 \.
grep -r --exclude-dir=\.svn 'function_name' *
的確,通過簡單的選項設置,我們達到了過濾.svn目錄的功能,但是每次都要輸入 --exclude-dir=\.svn 的選項,似乎太麻煩了一點,幸運的是linux下靈活的配置文件可以解決這一切:
打開 ~/.bashrc (這是bash的當前用戶配置文件),在文件的最上方添加這樣一條:
export GREP_OPTIONS="--exclude-dir=\.svn"
(注意 = 的前后不能有空格,不然在載入該配置文件時會提示錯誤)
export GREP_OPTIONS="--exclude-dir=\.svn --exclude-dir=\.git --exclude=tags --exclude=cscope\.out"
保存並關閉,同時在命令行鍵入如下命令:
source ~/.bashrc (讓bash重新讀取腳本)
當然,你也可以簡單地關閉shell並重新打開一個shell窗口
這樣當你使用grep時,bash都會自動幫你附加--exclude選項,從而節省不少輸入的時間:)