获取 xargs:尝试在文件中查找文本时未终止的引号

Dav*_*ave 3 bash grep xargs

我正在使用带有 bash shell 的 Mac 10.9.5。我试图在一组文件中搜索文本实例,但由于某种原因,在一个特定目录中,我收到了这个奇怪的“未终止的引用”错误......

Daves-MacBook-Pro:sbadmin davea$ find src/main/webapp/WEB-INF/ -name "*" | xargs grep 'addresses' > /tmp/addr
xargs: unterminated quote
Run Code Online (Sandbox Code Playgroud)

任何想法如何解决这个问题?

slh*_*hck 7

发生这种情况是因为其中一个文件名包含引号并按xargs原样传递给。这意味着xargs就像运行一样xargs grep 'addresses' > /tmp/addr some file'name-'这里有一个未终止的。

实际问题是您正在使用 find | xargs. 这是你真的不想做的事情,即使它看起来很诱人。

这个问题有几个解决方案:

  1. 使用-print0选项 forfind-0for xargs

    find src/main/webapp/WEB-INF/ -name "*" -print0 | xargs -0 grep 'addresses' > /tmp/addr
    
    Run Code Online (Sandbox Code Playgroud)

    这是推荐的管道 from findto方式,xargs因为它可以处理任何文件名,甚至包含换行符的文件名。

    请注意,使用-name "*"是多余的。您还应该考虑使用-type f仅过滤文件。当然,您也可以从 内部调用程序find

    find … -type f -exec grep 'addresses' {} \; > /tmp/addr
    
    Run Code Online (Sandbox Code Playgroud)

    但这也不推荐。查看第二个选项:

  2. 完全使用更有效的方法 -grep使用-r选项递归:

    grep -r 'addresses' src/main/webapp/WEB-INF/ > /tmp/addr
    
    Run Code Online (Sandbox Code Playgroud)