2017-05-27 41 views
1

我試圖搜索包含工作目錄下的一些具體文本的降價文件,所以我用命令如下:爲什麼grep打印出「沒有這樣的文件或目錄」?

find . -name "*.md" | xargs grep "interpretation" 

不過,雖然我得到的結果是什麼,我需要,該終端還打印出太多的錯誤如下圖所示:

grep: Problem: No such file or directory 
grep: Solving: No such file or directory 
grep: with: No such file or directory 
grep: Algorithms: No such file or directory 
…… 
etc 

,我寫我的解決方案如下一個答案。

+1

,如果你只想要在當前目錄下查找文件,而無需往裏走子目錄,只需使用'grep'解釋'* .md' ...並且如果您還需要子目錄,則使用'-type f'和'-exec'來代替xargs的'find' – Sundeep

+0

@Sundeep,謝謝!我搜索了關於'-exec'的用法,很方便!我會更新我的答案。我是命令行上的新手,對不起:) :)使用命令行的 – Hmgqzx

+0

永遠不會結束的體驗...您可能想要書籤https://unix.stackexchange.com/questions/321697/why-is-looping如果你打算經常使用'find',就會發現輸出不好的做法 – Sundeep

回答

1

找到了!

起初我使用的選項-s壓制錯誤,請here建議,但@Kelvin的評論讓我想起了真正的原因是,我的許多文件的名稱有spaces

所以,正確的命令是:

$ find . -name "*.md" -print0 | xargs -0 grep "some-text-want-to-find"(在OS X)

下面是一些更清楚的解釋,我發現:

類Unix系統允許嵌入spaces(甚至換行! )的文件名。這會導致如xargs這樣的程序出現問題,這些程序爲其他程序構建參數列表。嵌入的space將被視爲分隔符,結果命令會將每個由空格分隔的單詞解釋爲單獨的參數。爲了克服這個問題,findxarg允許可選地使用null字符作爲參數分隔符。 A null字符在ASCII中定義爲由數字0表示的字符(例如,與在數字32中表示的字符在ASCII中定義的space字符相反)。該查找命令提供的動作爲-print0,其產生null分隔輸出,並且xargs命令具有–null選項,該選項接受null分隔輸入。

- Linux命令行:完整介紹由William E. Shotts

警告:當你在OS X上,空分離xargs命令的選項–0


更新2017-05-27 22:58:48

感謝@Sundeep,他建議我使用-exec,這是find本身的新功能,而不是xargs

所以,用它來搜索在當前目錄下的文件及其子迪爾斯:

$ find . -type f -name "*.md" -exec grep "some-text-want-to-find" {} + 

注:

What is meaning of {} + in find's -exec command? - Unix & Linux Stack Exchange

相關問題