2012-03-01 71 views
3

我想在當前目錄及其子目錄下的每個.m文件中查找所有出現的ncread。我使用以下命令:使用grep --include選項?

grep -R --include="\.m" ncread . 

但是該命令返回nothings。 grep的聯機幫助頁說:

--include=GLOB 
    Search only files whose basename matches GLOB 

爲什麼它不起作用?謝謝!

回答

5

因爲例如 foobar.m的基名稱是 foobar

使用發現和grep像這樣:

find -name "*.m" | xargs grep "ncread" 

,或者如果你碰巧有空格在文件名:

find -name "*.m" -print0 | xargs -0 grep "ncread" 

編輯:
下面介紹如何使用grep做:

grep -R --include='*.m' ncread . 
+0

真的嗎? 'basename foobar.m'返回foobar.m – yorua007 2012-03-01 08:49:22

+0

確實,我想我自己做了一個傻瓜:) 我要去看一看源代碼。 – hroptatyr 2012-03-01 08:55:25

+0

@ yorua007看到我的拋光答案,實質上grep的文件匹配器需要匹配而不是部分匹配。 – hroptatyr 2012-03-01 09:56:15

5

水珠不是一個正則表達式,所以你需要使用的glob語法代替正則表達式語法:--include='*.m'(注單引號:你想逃跑的水珠你的shell,以避免擴大)

水珠字總結:

* - any number of any characters 
? - any single character 
[abc] - single 'a', 'b' or 'c' character 
\ - escaping, e.g. \* = single '*' character 

你可以開始閱讀有關水珠這裏,如果你需要更多的細節:Wiki page about glob

1

試試這個

grep -R --include="\\.m" ncread * 

grep手冊頁說include模式是一個GLOB,但至少在我的cygwin系統上,我已經通過實驗確認它實際上是一個正則表達式。

2

如果有人仍然感興趣, - 包括在我的ubuntu精確的grep版本2.10中被打破,我通過從GNU站點http://www.gnu.org/software/grep/#TOCdownloading下載新版本的grep(2.14)並從源代碼編譯來修復它。

-download the archive called grep-2.14.tar.xz 
-unpack it: xz -d grep-2.14.tar.xz 
-untar it: tar -xf grep-2.14.tar 
-remove the garbage: rm grep-2.14.tar 
-go to its directory: cd grep-2.14 
-do: ./configure 
-then: make 
-and finally: sudo make install 

現在運行grep --version以確保您現在安裝了2.14版本。 如果它仍然報告舊版本,請嘗試關閉終端窗口並打開一個新窗口。