为什么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
,我写我的解决方案如下一个答案。
找到了!
起初我使用的选项-s
压制错误,请here建议,但@Kelvin的评论让我想起了真正的原因是,我的许多文件的名称有spaces
。
所以,正确的命令是:
$ find . -name "*.md" -print0 | xargs -0 grep "some-text-want-to-find"
(在OS X)
下面是一些更清楚的解释,我发现:
类Unix系统允许嵌入
spaces
(甚至换行! )的文件名。这会导致如xargs
这样的程序出现问题,这些程序为其他程序构建参数列表。嵌入的space
将被视为分隔符,结果命令会将每个由空格分隔的单词解释为单独的参数。为了克服这个问题,find
和xarg
允许可选地使用null
字符作为参数分隔符。 Anull
字符在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
,如果你只想要在当前目录下查找文件,而无需往里走子目录,只需使用'grep'解释'* .md' ...并且如果您还需要子目录,则使用'-type f'和'-exec'来代替xargs的'find' – Sundeep
@Sundeep,谢谢!我搜索了关于'-exec'的用法,很方便!我会更新我的答案。我是命令行上的新手,对不起:) :)使用命令行的 – Hmgqzx
永远不会结束的体验...您可能想要书签https://unix.stackexchange.com/questions/321697/why-is-looping如果你打算经常使用'find',就会发现输出不好的做法 – Sundeep