为什么grep打印出“没有这样的文件或目录”?

问题描述:

我试图搜索包含工作目录下的一些具体文本的降价文件,所以我用命令如下:为什么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

找到了!

起初我使用的选项-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