【问题标题】:Why does grep print out "No such file or directory"?为什么 grep 打印出“没有这样的文件或目录”?
【发布时间】:2017-10-28 06:37:08
【问题描述】:

我尝试在工作目录下搜索包含某些特定文本的 MarkDown 文件,所以我使用了以下命令:

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

我在下面写了我的解决方案作为答案。

【问题讨论】:

  • 如果您只想在当前目录中搜索文件而不进入子目录,只需使用grep 'interpretation' *.md... 如果您还需要子目录,请使用-type f 和@987654326 @ 使用 find 而不是 xargs
  • @Sundeep,谢谢!我搜索了-exec的用法,很方便!我会更新我的答案。我是命令行新手,对此感到抱歉:)
  • 使用命令行是永无止境的体验...如果您打算定期使用find,您可能需要为unix.stackexchange.com/questions/321697/…添加书签

标签: macos grep find xargs


【解决方案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 字符作为参数分隔符。 null 字符在 ASCII 中定义为由数字 0 表示的字符(例如,space 字符在 ASCII 中定义为由数字 32 表示的字符)。 find 命令提供操作-print0,它产生null 分隔输出,xargs 命令具有–null 选项,它接受null 分隔输入。

—— The Linux Command Line: A Complete Introduction by 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 2014-09-20
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多